【问题标题】:performance by creating new variable通过创建新变量来提高性能
【发布时间】:2011-08-19 04:10:16
【问题描述】:

我想尽可能高效地编写我的 java 程序,所以我正在减少一切以获得最佳性能...在程序中,一个方法将称为 apprx。 900 万次。我必须计算一些东西,只需减去两个整数,这需要两次。 所以我的问题是,什么更快:用计算结果初始化新整数还是只计算两次值? 例如:

int result = a-b;
methodToCall(result, foo, bla);
otherMethod(result, bla, foo);

methodToCall(a-b, foo, bla);
otherMethod(a-b, bla foo);

我无法直接看到差异,但有时使用第一种方法会更快一些...... 一般来说:第一种方法总是更好吗?例如,当使用其他类型的计算(更复杂)时。 java 编译器或 jvm 是否正在使用它来优化它,例如看到我做了两次相同的计算,只做了一次,然后自己缓存了结果?

【问题讨论】:

  • 每当谈到性能时,我通常喜欢清晰的结果(虽然解释也很好),所以我对事物进行基准测试。我建议您以两种方式对调用方法的开始和结束时间进行 5000 次基准测试。比较结果。然后为 10000 执行此操作。到那时,您的答案应该很清楚。我就是这样做的。
  • 测量。然后决定。我的预感:太近了,不能打电话。差异可以忽略不计,尤其是 JVM 在优化方面非常聪明。

标签: java optimization jvm runtime


【解决方案1】:

第一个会理论上更快。

第二次,JVM不仅会计算两次a-b,还会临时为结果分配两次存储,然后再传递给两个方法调用。

我刚刚对这些案例进行了 1 亿次测试,得出的结果只有 10 到 15 毫秒的差异,而第一次更快。我的测试结果会出现偏差,因为 a 和 b 是常数,但它似乎证实了这个理论。

【讨论】:

  • 这个方法也可以被调用9亿次,所以区别是“感觉”:)谢谢!
  • 当然,请检查您的算法 - 方法调用等。它们将比这种分配/计算 int 值更昂贵。
  • 是的,当然,但我把它简化到了骨子里 :) 我现在有一个很好的运行时!
【解决方案2】:

只需测量时间。在不了解事实的情况下,您无法得出任何结论。 有关工具的问题,请参阅 this

如果很难注意到差异,请始终选择可读性好的代码。

【讨论】:

    【解决方案3】:

    JVM 可能会优化第二种情况下的代码,使其与第一种情况一样。但是,如果不是这样,它可能会花费您 1 个时钟周期,这可能是大约 3 毫秒(如果您在 3 GHz 处理器上调用 900 万次)

    我更喜欢第一种形式,因为它减少了重复,这对我来说更容易阅读。如果你的表达更昂贵,它可能会产生更大的影响。

    【讨论】:

      猜你喜欢
      • 2018-01-20
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多