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