Java优化
我想知道是否有任何性能差异
-
String s = someObject.toString(); 的System.out.println(一个或多个);
和
-
的System.out.println(someObject.toString());
看看生成的字节码,它似乎有差异。 JVM是否能够在运行时优化此字节码以使两种解决方案都提供相同的性能?
在这个简单的情况下,当然解决方案2似乎更合适,但有时我更倾向于解决方案1以实现可读性,我只想确保不会在关键代码部分中引入性能“降低”。
创建一个临时变量(特别是像String一样小的东西)对于代码的速度是无关紧要的,所以你应该不再担心这个问题。
尝试测量代码的这一部分所花费的实际时间,我敢打赌你会发现根本没有性能差异。 调用toString()
并打印出结果所花费的时间比存储临时值所花费的时间要长得多,我认为你根本不会发现可测量的差异。
即使字节码在这里看起来不同,也是因为javac
是天真的,你的JIT编译器会为你做繁重的工作。 如果这段代码真的对速度很重要,那么它将被执行很多次,你的JIT会选择它来编译为本机代码。 它们很可能都编译为相同的本机代码。
最后,为什么要在性能关键代码中调用System.out.println()
? 如果这里的任何事情会破坏你的表现,那就会。
如果您有需要性能的关键代码部分,请避免使用System.out.println()
。 转换到标准输出所产生的开销比使用变量赋值的开销要多。
做解决方案1。
编辑 :或解决方案2
没有*代码足够严重,两个样本之间的差异完全没有任何区别。 我鼓励你测试一下; 运行几百万次,并记录所花费的时间。
选择更易读和可维护的表单。
*
夸大效果。 如果你有足够的代码,你已经研究过它来学习这个。
生成的字节码不能很好地衡量给定代码片段的性能,因为这个字节码将被分析,优化并且(在服务器编译器的情况下)重新分析并重新优化(如果它被认为是性能瓶颈。
如有疑问,请使用分析器。
与输出到控制台相比,我怀疑两者之间的性能差异是可测量的。 在测量并确认您遇到问题之前不要进行优化。
- unit testingjava项目中所有类的可序列化
- 导致SAXException2的原因:“com.foo.Bar”的实例替换为“java.lang.Object”,但“com.foo.Bar”绑定到匿名类型
- Java 8,Lambda:在分组列表中排序并将所有组合并到列表中
- 如何使用Swing Timer延迟进度条的加载
- Java脚本安全(JRuby,Jython,Groovy,BeanShell等)
- 在JavaFX中启用/禁用按钮
- 无法将选项卡和空格插入PDBox PDF文档
- 面试问题:符合垃圾收集条件的对象
- 为什么Spark在本地模式下失败并且“无法获得broadcast_0的broadcast_0_piece0”?