Java导入与代码性能

new*_*bie 46 java import

我想知道我是否import在我的java程序中包含了很多,它是否会影响我的代码的性能(例如,程序会更慢)?importJava中的逻辑与includeC中的逻辑相同吗?

aio*_*obe 68

它会影响我的代码的性能(例如,程序会更慢)?

不,它不会影响代码的性能.

二进制文件(类文件)的大小不会增加,因为没有使用任何剪切和粘贴机制实现导入.

它仅仅是一种避免必须编写的语法糖

java.util.List<java.math.BigInteger> myList =
        new java.util.ArrayList<java.math.BigInteger>();
Run Code Online (Sandbox Code Playgroud)

这是一个小测试,证明了这一点:

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
Run Code Online (Sandbox Code Playgroud)

(修改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
Run Code Online (Sandbox Code Playgroud)

Java中的导入背后的逻辑是否与C中的包含相同?

不,a #include是预处理程序指令,并使用剪切和粘贴机制实现.

  • +1我喜欢使用md5sum来驱动点回家. (28认同)
  • @bestsss对于一个更全面的答案来说,这将是一个很好的补充,但它很难与"位相同的输出"争论. (3认同)

Ste*_*n C 22

...它会影响我的代码的性能吗?

没有丝毫.实际上,编译的类(使用或不使用)将是相同的.导入只是语法糖,允许您在源代码中使用较短的名称作为外部类或(使用静态导入)类成员.换句话说,它允许你写:

    Map map = new HashMap();
Run Code Online (Sandbox Code Playgroud)

代替

    java.util.Map map = new java.util.HashMap();
Run Code Online (Sandbox Code Playgroud)

就这些.

编译时间可能存在很小的(微小的)差异.但是,AFAIK,类似的东西import java.util.*;不会导致java.util编译器加载所有类.相反,它只是将类的名称添加到符号表中.

话说回来:

  • 不必要的导入是一个坏主意,因为它们使代码混乱,并可能误导读取代码的人.
  • 通配符导入(.*)可能导致意外冲突.
  • 许多人(包括我自己)不喜欢通配符导入,因为他们更喜欢看到所使用的实际类的列表.

Java中的导入背后的逻辑是否与C中的包含相同?

不它不是.

AC/C++ include指令将任意1个 C/C++"代码"注入源流.这可以包括声明和可执行语句......这可能会影响性能,执行内存占用量和可执行文件的大小.


1 - 也就是说,无论include文件的作者选择放入文件中.它可以是简单的方法和类"签名",但它也可能是宏,代码和其他有影响的声明.您必须检查文件以确定.


cor*_*iKa 13

它对程序的运行速度没有影响.

它可能会对程序的~compat_time速度产生影响.

如果您import java.util.*;将所有java.util包加载到编译器中,这可能会增加.*整个包用于单次使用的编译时间(尽管如果它将成为一个问题,您应该执行一些分析.)

除了潜在的编译时间问题,不要忘记考虑可读性问题.一般来说,我(以及我与之交谈的人)发现import pack.age.Class;import pack.age.*;在讨论这个问题之前与你的团队谈话更具可读性.

但它背后的逻辑#include与代码有很大不同,也没有膨胀.当您包含依赖关系jar时,您可能会得到更多必要但这可能不是一个大问题.

  • 在编写代码时,试图保持*编译时速度*似乎是一个坏主意.你去基准测试,看看是否有任何显着差异,并回来你的结果:-) (8认同)
  • "可以大大增加编译时间"是一个事实的断言.通过使用"大大",它也提出了一个大小的要求.如果你想把它作为一个需要调查的东西,并且没有在数量上提出任何要求,你应该写"可能会影响编译时间".断言没有足够的证据,可能是错误的.事实上的不准确是我拒绝回答的唯一原因,因为误导性的答案比没有更糟糕. (3认同)
  • 对于速度?是的,我愿意.http://www.javaperformancetuning.com/news/qotm031.shtml对于同步?在第二个字节码中有一个额外的字节码,因为它有一个同步指令,在第一个字节码中,它被烘焙到方法修饰符中(理论上它可以构成或破坏内联/ JIT,但极不可能). (2认同)
  • 但仍然没有基准测试.这将是有趣的. (2认同)
  • 至于Pascal没有得到一个downvote,那是因为他只是声称:"*可能*将为编译器花费更长时间(*一点*)"."大大"不仅仅是"有点",而"可以"超过"可能".顺便说一句,如果你知道那个重复的问题,为什么你没有链接到它? (2认同)