gpt4 book ai didi

java - java "cheat"尝试重复处理相同的信息时

转载 作者:行者123 更新时间:2023-11-30 10:53:25 26 4
gpt4 key购买 nike

我正在尝试分析一些方法以查看哪些实现速度更快。我遇到了一个障碍,因为 java 似乎在每次请求时都不处理所有信息来欺骗配置文件。

public void Profile() {
double[] testArray = new double[100000000];
Math math = new Math();
long start = System.nanoTime();
for (int i = 1; i <= 100000000; i++) {
testArray[i - 1] = math.Divide(i);
}
long stop = System.nanoTime();
System.out.println("math.divide(): " + TimeUnit.NANOSECONDS.toMillis(stop - start));
System.out.println(testArray[(int) (java.lang.Math.random() * (100000000 - 0))]);
}

public class Math {
public double Divide(int i) {
int dividend = i;
int divisor = 12;
return dividend / (double) divisor;
}
}

如果我不将 Math.Divide() 值分配给数组,整个 for 循环会在 2 毫秒内返回,而当我这样做时,它会在 ~200 毫秒内返回,这看起来仍然太快(考虑到相同的在 C# 中实现至少需要 1.8 秒)。

最终我的问题是:是否有更准确的方法来分析方法?以及如何重写 java 以使其停止跳过它认为多余的工作。

最佳答案

正如评论中已经提到的,这根本不是作弊。这是 JVM 的一项功能,该功能称为 JIT。在其他优化中,它将执行可见性检查,如果您执行的操作结果您从未使用过,它将完全避免运行代码。就像您的第一个示例一样。

换句话说:这不是错误,而是功能。一个真正的功能。

如果您想正确执行微基准测试,请使用 JMH。 Here是一个显示示例代码的链接,请注意有多少示例可以“解决”JVM 本来会执行的各种优化,以便基准测试环境保持稳定:JVM(至少是 HotSpot)非常非常擅长优化.

关于java - java "cheat"尝试重复处理相同的信息时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34010623/

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