【发布时间】:2018-09-25 02:19:52
【问题描述】:
为了比较短路求值逻辑运算符(例如&&)与位求值逻辑运算符(即&)的执行情况,我编写了这个示例并运行它:
package examples1;
import java.util.Scanner;
public class ShortCircuitOperatorsVSBitwiseOperators {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter A: "); boolean a = scanner.nextBoolean();
System.out.print("Enter B: "); boolean b = scanner.nextBoolean();
long startTimeShortCircuited = System.currentTimeMillis();
boolean resultShortCircuited = true;
for(long i = 0; i < 10000000000L; i++) {
resultShortCircuited = a && b;
}
long endTimeShortCircuited = System.currentTimeMillis();
System.out.println(resultShortCircuited + " in " + (endTimeShortCircuited - startTimeShortCircuited) + " milliseconds, short-circuited");
long startTimeBitwise = System.currentTimeMillis();
boolean resultBitwise = true;
for(long i = 0; i < 10000000000L; i++) {
resultBitwise = a & b;
}
long endTimeBitwise = System.currentTimeMillis();
System.out.println(resultBitwise + " in " + (endTimeBitwise - startTimeBitwise) + " milliseconds, bitwise");
scanner.close();
}
}
一个示例运行显示如下:
java examples1/ShortCircuitOperatorsVSBitwiseOperators
Enter A: false
Enter B: true
false in 4829 milliseconds, short-circuited
false in 3276 milliseconds, bitwise
这没有意义。我希望短路评估会更快,因为在这种情况下,如果左侧是false,它不会评估&& 的右侧。反直觉结果的原因是什么?
【问题讨论】:
-
问得好,但两个性能数据似乎相似。你检查过它是否可以重现吗?另外,更小/更大的循环会发生什么?
-
是的,它是可重现的。对于较小的循环,短路评估仍然较慢,就像较大的循环一样。
-
恭喜,您创建的微基准测试不正确。只需改变这两个操作的顺序(先按位,然后短路),你会得到相反的结果。这是因为 Java 启动时间、HotSpot 编译和许多其他因素。
-
微基准测试很难。我建议您将 JMH 视为正确微基准测试的框架。 stackoverflow.com/questions/504103/…
-
@ErwinBolwidt 我确实根据您的评论更改了顺序,短路评估仍然比按位慢。这是我第一次听说微基准测试的概念,所以无论如何都值得一看。谢谢。
标签: java bitwise-operators logical-operators short-circuiting