Java代码优化,它会优化这一点

May*_*Man 3 java optimization

对于较新的编译器,我发现自己试图编写更容易阅读的代码,但如果我希望在引擎盖下完成的优化实际上没有完成,那么可能需要更多的内存.以此代码为例,非常简单

while (scanner.hasNextLine() && !result)
{
    String line = scanner.nextLine();
    result = line.indexOf(searchString) >= 0;
}
Run Code Online (Sandbox Code Playgroud)

假设(使用Eclipse Juno,Java 7)这将产生与之相同的字节代码是否公平

while (scanner.hasNextLine() && !result)
{
    result = scanner.nextLine().indexOf(searchString) >= 0;
}
Run Code Online (Sandbox Code Playgroud)

前者虽然2行代码减少了第二行的长度并使其更容易在眼睛上.恕我直言但它是否也会导致创建一个无关的String对象?我希望不是 ...

Mar*_*nik 7

你无法逃脱String被创造的.将它分配给局部变量这一事实在这里是无关紧要的,实际上在字节码级别,这个事实甚至不会被注意到:在该级别,无论是否有显式变量,对结果的引用必须放在堆栈中为了传递到链中的下一个方法调用.

String创建不必要的实例的想法可能源于来自另一种语言的本能,例如C:赋值String s = ...仅将引用复制到唯一的字符串实例.这是因为所有Java对象都驻留在堆上,因此您始终需要显式复制对象以实际涉及另一个实例.例如,如果你写了String line = new String(scanner.nextLine()),那确实会创建一个不必要的实例String.

总而言之,任何版本的代码都不涉及优化,因此请仅根据样式首选项进行选择.


Jac*_*ack 7

一些一般原则:

  • 过早优化是毫无意义的
  • 在这些小问题中节省可读性是毫无意义的
  • 大多数时候,优化来自于改变算法及其复杂性
  • 在尝试优化不是算法的东西时,你永远不会像编译器一样好
  • 确保任何优化只有两种方式:查看字节码或基准测试性能,其他一切通常都是猜测

在您的特定情况下:变量声明在optimitation方面不会改变任何东西,因为在两种情况下,字符串都被赋予nextLine()并放置在堆栈上,将其分配给变量(在字节码中消失,除非它是实例变量,如它的用处仅适用于你的眼睛)不会改变任何东西.