web-dev-qa-db-fra.com

Importation Java vs performance du code

Je me demande si j'ai inclus plusieurs import dans mon programme Java, cela affecterait-il les performances de mon code (par exemple, le programme sera plus lent)? Est-ce que la logique derrière import en Java est identique à include en C?

43
newbie

cela affecterait-il les performances de mon code (par exemple, le programme sera plus lent)?

Non, cela n'affectera pas les performances de votre code.

La taille des fichiers binaires (les fichiers de classe) n’augmente pas car l’importation est not implémentée avec n’importe quel mécanisme couper-coller.

C'est simplement un sucre syntaxique pour éviter d'avoir à écrire par exemple

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

Voici un petit test démontrant ceci:

aioobe@e6510:~/tmp$ cat Test.Java 
import Java.util.*;

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

(modification de Test.Java)

aioobe@e6510:~/tmp$ cat Test.Java 


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

La logique de l'importation en Java est-elle la même que celle de l'inclusion en C?

Non, un #include est une directive de préprocesseur et est implémenté avec un mécanisme de copier/coller.

64
aioobe

... cela affecterait-il les performances de mon code

Pas le moins du monde. En fait, les classes compilées (en utilisant imports ou non) seront identiques. Une importation est simplement un sucre syntaxique qui vous permet d'utiliser un nom plus court pour une classe externe ou un membre de classe (avec une importation statique) dans votre code source. En d'autres termes, cela vous permet d'écrire:

    Map map = new HashMap();

au lieu de

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

C'est tout.

Il y a potentiellement une petite (infime) différence dans les temps de compilation. Mais, autant que je sache, quelque chose comme import Java.util.*; ne provoque PAS le chargement de toutes les classes Java.util par le compilateur. Au lieu de cela, il ajoute simplement les noms des classes à la table des symboles.

Ayant dit cela:

  • Les importations inutiles sont une mauvaise idée, car elles encombrent le code et peuvent induire en erreur quelqu'un qui lit le code.
  • Les importations génériques (.*) peuvent entraîner des collisions inattendues.
  • Beaucoup de gens (moi-même inclus) n'aiment pas les importations génériques car ils préfèrent voir une liste des classes réellement utilisées.

La logique derrière l'importation en Java est-elle la même que celle incluse dans C?

Non ce n'est pas.

Une directive include C/C++ s’injecte arbitrairement1 "Code" C/C++ dans le flux source. Cela peut inclure des déclarations et des instructions exécutables ... qui peuvent affecter à la fois les performances, l'encombrement de la mémoire d'exécution et la taille de l'exécutable.


1 - C’est-à-dire quel que soit le choix des auteurs du fichier include dans le fichier. Il pourrait s'agir d'une méthode et de "signatures" de classe simples, mais il pourrait également s'agir de déclarations de macro, de code et d'autres déclarations ayant un impact. Vous devez examiner le fichier pour en être sûr.

21
Stephen C

import ne ralentit pas votre programme. Il est préférable d’avoir différents types de classes dans différents packages et de les importer selon les besoins. Améliore la lisibilité du code.

1
fastcodejava

L'importation n'est pas un problème. Vous pouvez importer tout ce que vous voulez du paquet et l'exécution de votre code ne deviendra pas plus lente. import est pratique, vous pouvez donc utiliser des noms plus courts.

Les classes sont chargées lorsque leur constructeur est appelé implicitement ou explicitement ( new operator). Dans le cas d'enums, ce sera lorsque vous vous référerez aux noms d'énum dans votre code. Cela provoquera le chargement de la classe (enum). (Vous pouvez essayer d'utiliser println dans le constructeur privé d'enum pour expérimenter et voir quand enum est chargé). Charger une classe prend du temps et de la mémoire. De manière générale, les classes chargées ne sont pas censées être déchargées.

0
Witold Kaczurba