Integer.equals() 和 Objects.equals() 的比较
Comparasion of Integer.equals() and Objects.equals()
以下是我对两种 equals 方法的测试:
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
所以,我的问题是:为什么在这两种情况下,第二个 "test" 的执行速度都比第一个快得多?它取决于什么?
因为 JIT 启动,并检测到 Random.nextInt()
和 equals()
是两个经常调用的方法,因此优化它们很有用。
一旦字节码被优化并转换为本机代码,它的执行速度就会更快。
请注意,您测量的值可能 Random.nextInt() 多于 equals()。
由于 JIT 进行的运行时优化和垃圾收集,在 Java 中很难正确执行微基准测试。想认真点就用JMH
以下是我对两种 equals 方法的测试:
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
所以,我的问题是:为什么在这两种情况下,第二个 "test" 的执行速度都比第一个快得多?它取决于什么?
因为 JIT 启动,并检测到 Random.nextInt()
和 equals()
是两个经常调用的方法,因此优化它们很有用。
一旦字节码被优化并转换为本机代码,它的执行速度就会更快。
请注意,您测量的值可能 Random.nextInt() 多于 equals()。
由于 JIT 进行的运行时优化和垃圾收集,在 Java 中很难正确执行微基准测试。想认真点就用JMH