据我所知,每个类都知道它所扩展的所有类和它实现的接口。这些可以存储在哈希集合中,以实现O(1)的查找时间。
当代码经常执行相同的分支时,CPU可以在确定是否应该采用分支之前执行分支中的代码,从而几乎消除成本,使成本几乎为零。
由于微基准测试是在4年前执行的,因此我期望最新的CPU和JVM速度更快。
public static void main(String... args) {
Object[] doubles = new Object[100000];
Arrays.fill(doubles, 0.0);
doubles[100] = null;
doubles[1000] = null;
for (int i = 0; i < 6; i++) {
testSameClass(doubles);
testSuperClass(doubles);
testInterface(doubles);
}
}
private static int testSameClass(Object[] doubles) {
long start = System.nanoTime();
int count = 0;
for (Object d : doubles) {
if (d instanceof Double)
count++;
}
long time = System.nanoTime() - start;
System.out.printf("instanceof Double took an average of %.1f ns%n", 1.0 * time / doubles.length);
return count;
}
private static int testSuperClass(Object[] doubles) {
long start = System.nanoTime();
int count = 0;
for (Object d : doubles) {
if (d instanceof Number)
count++;
}
long time = System.nanoTime() - start;
System.out.printf("instanceof Number took an average of %.1f ns%n", 1.0 * time / doubles.length);
return count;
}
private static int testInterface(Object[] doubles) {
long start = System.nanoTime();
int count = 0;
for (Object d : doubles) {
if (d instanceof Serializable)
count++;
}
long time = System.nanoTime() - start;
System.out.printf("instanceof Serializable took an average of %.1f ns%n", 1.0 * time / doubles.length);
return count;
}
最终打印
instanceof Double took an average of 1.3 ns
instanceof Number took an average of 1.3 ns
instanceof Serializable took an average of 1.3 ns
如果我将“doubles”更改为
for(int i=0
doubles[i] = ""
I get
instanceof Double took an average of 1.3 ns
instanceof Number took an average of 1.6 ns
instanceof Serializable took an average of 2.2 ns
注意:如果我更改
if (d instanceof Double)
to
if (d != null && d.getClass() == Double.class)
性能没有变化。
Double
情况,由于该类是final
,因此测试与d != null && d.getClass() == Double.class
相同。 - Peter Lawrey