gpt4 book ai didi

java - 与迭代次数无关的性能测试

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:59:02 27 4
gpt4 key购买 nike

试图回答这张票:What is the difference between instanceof and Class.isAssignableFrom(...)?

我做了一个性能测试:

class A{}
class B extends A{}

A b = new B();

void execute(){
boolean test = A.class.isAssignableFrom(b.getClass());
// boolean test = A.class.isInstance(b);
// boolean test = b instanceof A;
}

@Test
public void testPerf() {
// Warmup the code
for (int i = 0; i < 100; ++i)
execute();

// Time it
int count = 100000;
final long start = System.nanoTime();
for(int i=0; i<count; i++){
execute();
}
final long elapsed = System.nanoTime() - start;
System.out.println(count+" iterations took " + TimeUnit.NANOSECONDS.toMillis(elapsed) + "ms.);
}

这给了我:

  • A.class.isAssignableFrom(b.getClass()):100000 次迭代花费了 15 毫秒
  • A.class.isInstance(b):100000 次迭代耗时 12 毫秒
  • b instanceof A:100000 次迭代花费了 6 毫秒

但是通过迭代次数,我可以看到性能是恒定的。对于 Integer.MAX_VALUE :

  • A.class.isAssignableFrom(b.getClass()):2147483647 次迭代花费了 15 毫秒
  • A.class.isInstance(b):2147483647 次迭代花费了 12 毫秒
  • b instanceof A:2147483647 次迭代花费了 6 毫秒

认为这是一个编译器优化(我用 JUnit 运行这个测试),我把它改成这样:

@Test
public void testPerf() {
boolean test = false;

// Warmup the code
for (int i = 0; i < 100; ++i)
test |= b instanceof A;

// Time it
int count = Integer.MAX_VALUE;
final long start = System.nanoTime();
for(int i=0; i<count; i++){
test |= b instanceof A;
}
final long elapsed = System.nanoTime() - start;
System.out.println(count+" iterations took " + TimeUnit.NANOSECONDS.toMillis(elapsed) + "ms. AVG= " + TimeUnit.NANOSECONDS.toMillis(elapsed/count));

System.out.println(test);
}

但性能仍然“独立”于迭代次数。有人可以解释这种行为吗?

最佳答案

  1. 一百次迭代不足以进行热身。默认编译阈值为 10000 次迭代(一百倍以上),因此最好至少超过该阈值一点。
  2. 一旦编译被触发,世界就不会停止;编译在后台进行。这意味着它的效果只会在稍有延迟后才会开始显现。
  3. 有足够的空间来优化您的测试,以便将整个循环折叠成最终结果。这可以解释常数。

无论如何,我总是通过让外部方法调用内部方法大约 10 次来进行基准测试。内部方法会根据需要进行大量迭代,例如 10,000 次或更多次,以使其运行时间至少增加数十毫秒。我什至不理会 nanoTime,因为如果微秒精度对您很重要,那只是测量时间间隔太短的标志。

当您这样做时,您可以让 JIT 轻松执行内部方法的编译版本,之后它被替换为解释版本。另一个好处是您可以确保内部方法的时间稳定。

关于java - 与迭代次数无关的性能测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12106799/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com