我对此感到困惑。
在我的机器上
- 直接计算:375毫秒
- 方法计算:3594 ms,大约慢十倍
- 如果我将方法计算放在直接计算之前,则两个时间都是相似的。
你会在你的机器上检查它吗?
class Test {
static long COUNT = 50000 * 10000;
private static long BEFORE;
/*--------METHOD---------*/
public static final double hypotenuse(double a, double b) {
return Math.sqrt(a * a + b * b);
}
/*--------TIMER---------*/
public static void getTime(String text) {
if (BEFORE == 0) {
BEFORE = System.currentTimeMillis();
return;
}
long now = System.currentTimeMillis();
long elapsed = (now - BEFORE);
BEFORE = System.currentTimeMillis();
if (text.equals("")) {
return;
}
String message = "\r\n" + text + "\r\n" + "Elapsed time: " + elapsed + " ms";
System.out.println(message);
}
public static void main(String[] args) {
double a = 0.2223221101;
double b = 122333.167;
getTime("");
/*--------DIRECT CALCULATION---------*/
for (int i = 1; i < COUNT; i++) {
Math.sqrt(a * a + b * b);
}
getTime("Direct: ");
/*--------METHOD---------*/
for (int k = 1; k < COUNT; k++) {
hypotenuse(a, b);
}
getTime("Method: ");
}
}
最佳答案
无论哪种方式对我来说都是零差异。
如果有什么不同的话,这只是证明了基准微优化的危险。不要这样做。这完全是浪费时间。
至于为什么你会看到差异:不知道。我在 Win7 Ultimate 64 上使用具有健康内存大小的 JDK 6u17(32 位)。也许您使用的是不同的版本。也许这是 JIT 编译的问题。
无论什么原因,担心有方法调用和没有方法调用之间的区别都是无关紧要的干扰。
关于java - 奇怪的表现行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2842681/