代码之家  ›  专栏  ›  技术社区  ›  Manuel Selva

Java优化

  •  1
  • Manuel Selva  · 技术社区  · 16 年前

    我想知道两者之间是否有任何性能差异

    1. 字符串s=someObject.toString();System.out.println(s);

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

    在这个简单的情况下,当然,解决方案2似乎更合适,但有时出于可读性的目的,我更喜欢解决方案1,我只是想确保不会在关键代码段引入性能“下降”。

    5 回复  |  直到 5 年前
        1
  •  6
  •   Todd Gamblin    16 年前

    创建临时变量(尤其是像String这样小的变量)对代码的速度无关紧要,所以你应该停止担心这一点。

    尝试测量在代码的这一部分花费的实际时间,我打赌你会发现根本没有性能差异。打电话所需的时间 toString()

    即使字节码在这里看起来不同,也是因为 javac 是幼稚的,你的JIT编译器为你做了繁重的工作。如果这段代码真的对速度很重要,那么它将被执行很多次,你的JIT将选择它编译成本机代码。这两者很可能都编译成相同的本机代码。

    最后,你为什么打电话来 System.out.println() 在性能关键代码中?如果这里有什么东西会扼杀你的表现,那就是。

        2
  •  2
  •   Kekoa    16 年前

    如果您有需要性能的关键代码段,请避免使用 System.out.println() 。使用标准输出产生的开销比使用变量赋值产生的开销要多。

    执行解决方案1。

    :或解决方案2

        3
  •  2
  •   Michael Petrotta user3140870    16 年前

    没有一个*代码足够关键,以至于两个示例之间的差异根本不会产生任何影响。我鼓励你测试一下;运行几百万次,并记录所花费的时间。

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

    *

        4
  •  2
  •   Robert Munteanu    16 年前

    生成的字节码是 这是对给定代码性能的一个很好的衡量标准,因为如果这个字节码被认为是性能瓶颈,它将被分析、优化和(在服务器编译器的情况下)重新分析和优化。

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

        5
  •  1
  •   jerryjvl    16 年前

    与控制台的输出相比,我怀疑 任何 两者之间的性能差异将是可衡量的。在你测量并确认你有问题之前,不要进行优化。