Мне интересно, включил ли я несколько import
в мою java-программу, повлияет ли это на производительность моего кода (например, программа будет медленнее)? Является ли логика import
в Java такой же, как include
в C?
Импорт Java и производительность кода
Ответ 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
и импортировать их по мере необходимости. Улучшает читаемость кода.