【发布时间】:2020-10-06 06:43:17
【问题描述】:
在Java中,我有两个不同的语句通过使用三元运算符完成相同的结果,如下:
num < 0 ? 0 : num;num * (num < 0 ? 0 : 1);
似乎第二个语句不必要地复杂,并且会比第一个语句花费更长的时间,但是当我使用以下代码记录每个语句所用的时间时,结果如下:
final long startTime = System.currentTimeMillis();
Random rand = new Random();
float[] results = new float[100000000];
for (int i = 0; i < 100000000; i++) {
float num = (rand.nextFloat() * 2) - 1;
results[i] = num < 0 ? 0 : num;
//results[i] = num * (num < 0 ? 0 : 1);
}
final long endTime = System.currentTimeMillis();
System.out.println("Total Time: " + (endTime - startTime));
- 1.232 秒
- 1.023 秒 (每个平均运行 5 次)
为什么在使用第二条语句时会有如此显着的加速?它似乎包括不必要的乘法并具有相同的比较。第一个创建分支,而第二个没有?
【问题讨论】:
-
嘿!您能否分享有关您如何记录运行时的详细信息?
-
发布一个完整的工作示例,以便我们验证您的结果。
-
我想知道是什么棘手的优化让你在这里模糊了结果。我敢打赌,如果你通过 JMH 之类的方法运行它,结果可能看起来会有些不同。
-
我可以在 Java 中重现该问题,但无法使用 C++ 重现它。
-
我做了另一个观察:当您将
num * (num < 0 ? 0 : 1);中的一个结果整数更改为float时,例如0f或1f,语句变得和另一个一样慢。
标签: java performance optimization conditional-operator