2009-06-03 136 views
1

我想知道如果有)爪哇优化

  1. 的String = someObject.toString之间的任何性能差异(;的System.out.println(一个或多个);

  2. 的System.out.println(someObject.toString());

看着生成的字节码,它似乎有差异。 JVM是否能够在运行时优化此字节码以使两种解决方案都能提供相同的性能?

在这个简单的例子,当然解决方案2似乎更合适,但有时我宁愿解决方案1可读性目的,我只是想确保不引入表演中的关键代码段“减少”。

回答

6

一个临时变量(尤其是一些小如字符串)的创建是无关紧要的代码的速度,让您无需担心这一点。

尝试测量在这部分代码中花费的实际时间,我打赌你会发现根本没有性能差异。拨打toString()并打印出结果需要的时间比存储临时值所用的时间要长得多,我认为您不会在此找到可衡量的差异。

即使字节码看起来不同,这里,是因为javac是幼稚和你的JIT编译器做繁重的你。如果这段代码对于速度真的很重要,那么它会被执行很多次,并且你的JIT将选择它来编译为本地代码。它们很可能都编译为相同的本地代码。

最后,你为什么要在性能关键的代码中调用System.out.println()?如果这里有什么会杀死你的表现的话,那会的。

+0

感谢您的回答。例如,println就在这里(我必须承认这是一个糟糕的例子)。当然,我没有在关键代码部分使用它。 Manu – 2009-06-03 07:42:46

1

相比输出到控制台,我怀疑任何之间的性能差异将是可衡量的。在您测量并确认您遇到问题之前,请勿优化。

2

如果你有关键代码段是要求高性能,避免使用System.out.println()。进行标准输出所带来的开销比任何变量赋值都要多。

待办事项解决方案1.

编辑:或解决方案2

2

没有*代码,以至于你的两个样本之间的差异使得任何差别的关键。我鼓励你测试一下;运行几百万次,并记录所花费的时间。

选择更具可读性和可维护性的表单。

*夸大其词。如果你有足够的代码,你已经研究过它来学习这一点。

2

生成的字节码是的给定的一段代码的性能的很好的措施,因为这字节码将得到分析,优化,和(在服务器编译器的情况下)重新分析和重新优化如果它被认为是性能瓶颈。

如有疑问,请使用分析器。

+0

+1“for a profiler” – 2009-10-30 15:22:51