对于较新的编译器,我发现自己试图编写更容易阅读的代码,但如果我希望在引擎盖下完成的优化实际上没有完成,那么可能需要更多的内存.以此代码为例,非常简单
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对象?我希望不是 ...
你无法逃脱String被创造的.将它分配给局部变量这一事实在这里是无关紧要的,实际上在字节码级别,这个事实甚至不会被注意到:在该级别,无论是否有显式变量,对结果的引用必须放在堆栈中为了传递到链中的下一个方法调用.
您String创建不必要的实例的想法可能源于来自另一种语言的本能,例如C:赋值String s = ...仅将引用复制到唯一的字符串实例.这是因为所有Java对象都驻留在堆上,因此您始终需要显式复制对象以实际涉及另一个实例.例如,如果你写了String line = new String(scanner.nextLine()),那确实会创建一个不必要的实例String.
总而言之,任何版本的代码都不涉及优化,因此请仅根据样式首选项进行选择.
一些一般原则:
在您的特定情况下:变量声明在optimitation方面不会改变任何东西,因为在两种情况下,字符串都被赋予nextLine()并放置在堆栈上,将其分配给变量(在字节码中消失,除非它是实例变量,如它的用处仅适用于你的眼睛)不会改变任何东西.
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |