Java 通过创建新变量来提高性能

Java 通过创建新变量来提高性能,java,optimization,jvm,runtime,Java,Optimization,Jvm,Runtime,我想写我的java程序尽我所能的性能,所以我减少了一切,以获得最佳性能。。。在程序中,一个方法称为apprx。900万次。在这里,我必须计算一些东西,只需减去两个整数,它们需要两次。 所以我的问题是,什么更快:用计算结果初始化新的整数,还是只计算两次值? e、 g: 或 我看不出直接的区别,但有时第一种方法会快一点。。。 总的来说:第一种方法总是更好吗?e、 g当使用其他类型的计算(更复杂)时。java编译器或jvm是否正在对其进行优化,例如,我做了两次相同的计算,只做了一次,并自行缓存结果?j

我想写我的java程序尽我所能的性能,所以我减少了一切,以获得最佳性能。。。在程序中,一个方法称为apprx。900万次。在这里,我必须计算一些东西,只需减去两个整数,它们需要两次。 所以我的问题是,什么更快:用计算结果初始化新的整数,还是只计算两次值? e、 g:

我看不出直接的区别,但有时第一种方法会快一点。。。
总的来说:第一种方法总是更好吗?e、 g当使用其他类型的计算(更复杂)时。java编译器或jvm是否正在对其进行优化,例如,我做了两次相同的计算,只做了一次,并自行缓存结果?

jvm可能会优化第二种情况下的代码,使其与第一种情况类似。然而,如果不这样做,它可能会花费你1个时钟周期,大约3毫秒(如果你在3 GHz处理器上称它为900万次)


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

JVM可能会优化第二种情况下的代码,使其与第一种情况类似。然而,如果不这样做,它可能会花费你1个时钟周期,大约3毫秒(如果你在3 GHz处理器上称它为900万次)


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

只需测量时间即可。不知道事实,你就不能得出任何结论。 请参阅有关工具的问题


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

只需测量时间即可。不知道事实,你就不能得出任何结论。 请参阅有关工具的问题

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

理论上第一种代码会更快

在第二种情况下,JVM不仅会计算
a-b
两次,而且还会在将结果传递给两个方法调用之前临时为结果分配两次存储

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

在第二种情况下,JVM不仅会计算
a-b
两次,而且还会在将结果传递给两个方法调用之前临时为结果分配两次存储


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

每当涉及到性能时,我通常喜欢清晰的结果(尽管解释也很好),所以我对事情进行基准测试。我建议您以两种方式对调用方法的开始和结束时间进行基准测试,大约5000次。比较结果。那就花10000美元。到那时你的答案应该清楚了。这就是我要做的。然后决定。我的直觉是:太近了,打不到电话。这种差异可以忽略不计,尤其是JVM在优化方面非常聪明。每当涉及到性能时,我通常喜欢清晰的结果(尽管解释也很好),所以我会对事情进行基准测试。我建议您以两种方式对调用方法的开始和结束时间进行基准测试,大约5000次。比较结果。那就花10000美元。到那时你的答案应该清楚了。这就是我要做的。然后决定。我的直觉是:太近了,打不到电话。这种差异可以忽略不计,特别是JVM在优化方面非常聪明。这种方法也可以被调用9亿次,所以这种差异是“可以感觉到的”:)谢谢!当然,请检查您的算法-方法调用等。它们将比int值的赋值/计算要昂贵得多。是的,当然,但我将其简化为:)我现在有了一个很好的运行时!该方法也可以被调用9亿次,因此差异是“可感觉的”:)谢谢!当然,请检查您的算法-方法调用等。它们将比int值的赋值/计算要昂贵得多。是的,当然,但我将其简化为:)我现在有了一个很好的运行时!
int result = a-b;
methodToCall(result, foo, bla);
otherMethod(result, bla, foo);
methodToCall(a-b, foo, bla);
otherMethod(a-b, bla foo);