Подтвердить что ты не робот

Импорт Java и производительность кода

Мне интересно, включил ли я несколько import в мою java-программу, повлияет ли это на производительность моего кода (например, программа будет медленнее)? Является ли логика import в Java такой же, как include в C?

4b9b3361

Ответ 1

повлияет ли это на производительность моего кода (например, программа будет медленнее)?

Нет, это не повлияет на производительность вашего кода.

Двоичные файлы (файлы классов) не увеличиваются, поскольку импорт не реализуется с помощью механизма вырезания и вставки.

Это просто синтаксический сахар, чтобы избежать необходимости писать, например,

java.util.List<java.math.BigInteger> myList =
        new java.util.ArrayList<java.math.BigInteger>();

Вот небольшой тест, демонстрирующий это:

[email protected]:~/tmp$ cat Test.java 
import java.util.*;

public class Test {
    public static void main(String[] args) {
        List<Integer> myInts = new ArrayList<Integer>();
    }
}
[email protected]:~/tmp$ javac Test.java
[email protected]:~/tmp$ md5sum Test.class 
523036e294b17377b4078ea1cb8e7940  Test.class

(изменение Test.java)

[email protected]:~/tmp$ cat Test.java 


public class Test {
    public static void main(String[] args) {
        java.util.List<Integer> myInts = new java.util.ArrayList<Integer>();
    }
}
[email protected]:~/tmp$ javac Test.java
[email protected]:~/tmp$ md5sum Test.class 
523036e294b17377b4078ea1cb8e7940  Test.class

Является ли логика импорта в Java такой же, как и в C?

Нет, #include - это препроцессорная директива и реализуется с помощью механизма вырезания и вставки.

Ответ 2

... это повлияет на производительность моего кода.

Не в малейшей степени. Фактически, скомпилированные классы (с использованием импорта или нет) будут идентичными. Импорт - это просто синтаксический сахар, который позволяет использовать более короткое имя для внешнего класса или (со статическим импортом) класса в исходном коде. Другими словами, он позволяет вам написать:

    Map map = new HashMap();

вместо

    java.util.Map map = new java.util.HashMap();

Вот и все.

Существует потенциальная небольшая (крошечная) разница во времени компиляции. Но AFAIK, что-то вроде import java.util.*; НЕ приводит к тому, что все классы java.util загружаются компилятором. Скорее, он просто добавляет имена классов в таблицу символов.

Сказав, что:

  • Ненужный импорт - плохая идея, потому что они загромождают код и могут ввести в заблуждение кого-то, читающего код.
  • Импорт подстановок (.*) может привести к неожиданным столкновениям.
  • Множество людей (включая меня) не любят импорт подстановочных знаков, потому что они предпочитают видеть список используемых фактических классов.

Является ли логика импорта в Java такой же, как и в C?

Нет, это не так.

A C/С++ include директива вводит произвольный код 1 C/С++ в исходный поток. Это может включать объявления и исполняемые операторы..., которые могут влиять как на производительность, так и на объем исполняемой памяти и размер исполняемого файла.


1 - То есть независимо от того, какие авторы файла include решили поместить в файл. Это может быть простой метод и класс "подписи", но также могут быть макросами, кодами и другими объявлениями. Вы должны проверить файл, чтобы убедиться.

Ответ 3

Это не повлияет на скорость ~ run ~ вашей программы.

Это может повлиять на скорость ~ компиляции ~ вашей программы.

Если вы import java.util.*; загрузите весь пакет java.util в компилятор, что может увеличить время компиляции, когда вы .* весь пакет для одного использования (хотя вам нужно выполнить некоторое профилирование, если оно будет для беспокойства.)

В дополнение к потенциальным проблемам времени компиляции, не забывайте учитывать проблемы читаемости. Как правило, я (и люди, с которыми я общался) нахожу import pack.age.Class; более читабельным, чем import pack.age.*; - поговорите с вашей командой, прежде чем принимать решение об этом.

Но логика позади этого сильно отличается от #include и не раздувает код. Вы можете в конечном итоге получить больше, чем необходимо, поскольку вы включаете банки зависимостей, но это, вероятно, не большая проблема.

Ответ 4

import не замедляет вашу программу. Лучше иметь разные типы classes в разных packages и импортировать их по мере необходимости. Улучшает читаемость кода.