以下是我对两个等于方法的测试:
Random generator = new Random();
long startTime = System.nanoTime();
for(int i = 0; i<1000; i++) {
Integer int11 = generator.nextInt(1000);
Integer int22 = generator.nextInt(1000);
int11.equals(int22);
}
long endTime = System.nanoTime();
long duration = (endTime - startTime);
System.out.println(duration + " ns");
Random generator1 = new Random();
long startTime1 = System.nanoTime();
for(int i = 0; i<1000; i++) {
Integer int1 = generator1.nextInt(1000);
Integer int2 = generator1.nextInt(1000);
Objects.equals(int1, int2);
}
long endTime1 = System.nanoTime();
long duration1 = (endTime1 - startTime1);
System.out.println(duration1 + " ns");
我只是想知道,Objects.equals()方法的速度有多慢,但我得到了以下输出:
1005750 ns
650554 ns
当我替换这两种方法时:
Random generator1 = new Random();
long startTime1 = System.nanoTime();
for(int i = 0; i<1000; i++) {
Integer int1 = generator1.nextInt(1000);
Integer int2 = generator1.nextInt(1000);
Objects.equals(int1, int2);
}
long endTime1 = System.nanoTime();
long duration1 = (endTime1 - startTime1);
System.out.println(duration1 + " ns");
Random generator = new Random();
long startTime = System.nanoTime();
for(int i = 0; i<1000; i++) {
Integer int11 = generator.nextInt(1000);
Integer int22 = generator.nextInt(1000);
int11.equals(int22);
}
long endTime = System.nanoTime();
long duration = (endTime - startTime);
System.out.println(duration + " ns");
我得到与前一个非常相似的输出:
1026871 ns
614074 ns
所以,我的问题是:为什么第二个&#34;测试&#34;在两种情况下执行速度都比第一次快得多?它取决于什么?
答案 0 :(得分:4)
因为JIT启动,并检测到Random.nextInt()
和equals()
是两种经常被调用的方法,因此优化它们非常有用。
一旦优化了字节码并将其转换为本机代码,其执行速度就会更快。
请注意,您测量的内容可能比equals()更接近Random.nextInt()。
由于JIT完成运行时优化以及垃圾回收,正确的微基准测试在Java中很难做到。如果你想认真对待它,请使用JMH。