我对此感到困惑。
在我的机器上
直接计算:375毫秒
方法计算:3594毫秒,大约慢了十倍
如果在直接计算之前放置方法校准,则两次都相似。
会在机器中检查吗?
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/