我想知道
之间是否存在任何性能差异String s = someObject.toString();的System.out.println(一个或多个);
和
的System.out.println(someObject.toString());
查看生成的字节码,似乎有差异。 JVM是否能够在运行时优化此字节码以使两种解决方案都提供相同的性能?
在这个简单的情况下,当然解决方案2似乎更合适,但有时我更倾向于解决方案1以实现可读性,我只想确保不会在关键代码部分中引入性能“降低”。
答案 0 :(得分:6)
创建一个临时变量(特别是像String一样小的东西)对于代码的速度是无关紧要的,所以你应该不再担心这个。
尝试测量代码的这部分所花费的实际时间,我打赌你会发现根本没有性能差异。调用toString()
并打印结果所花费的时间比存储临时值所花费的时间要长得多,而且我认为你根本不会发现可衡量的差异。
即使字节码在这里看起来不同,也是因为javac
是天真的,你的JIT编译器会为你做繁重的工作。如果这段代码对速度非常重要,那么它将被执行很多次,你的JIT会选择它来编译为本机代码。很可能这两个编译为相同的本机代码。
最后,为什么要在性能关键代码中调用System.out.println()
?如果这里的任何事情会破坏你的表现,那就会。
答案 1 :(得分:2)
如果您有要求性能的关键代码部分,请避免使用System.out.println()
。转换到标准输出所产生的开销比变量赋值要多。
做解决方案1.
修改:或解决方案2
答案 2 :(得分:2)
没有足够的*代码,两个样本之间的差异完全不同。我鼓励你测试一下;运行几百万次,并记录所花费的时间。
选择更具可读性和可维护性的表单。
*
夸大效果。如果你有足够的代码,你已经研究过它来学习这个。
答案 3 :(得分:2)
生成的字节码不衡量给定代码片段的性能,因为这个字节码将被分析,优化并且(在服务器编译器的情况下)重新分析和如果被认为是性能瓶颈,则重新优化。
如有疑问,请使用分析器。
答案 4 :(得分:1)
与输出到控制台相比,我怀疑两者之间的任何性能差异是可测量的。在测量并确认您遇到问题之前不要进行优化。