我在Java中看到一些奇怪的行为:
注释println
会使函数执行得更慢
取消注释println
会使函数执行得更快。
我希望这会被逆转,因为println
应该花费时间。
触发器是System.out.println("");
函数中的sequentialProcessData
随着评论线我得到2.5秒
随着线路取消注释,我得到1.9秒。
该行为与使用nanotime()
或currentTimeMillis()
来衡量时间无关。
此外,我在用标志触发println
时无法重现该行为。
使用Eclipse,jdk1.7.0_51(JavaSE),Windows 7进行测试(重要的是8核)。
谢谢
修改
当我在Eclipse中编译代码时,这种情况只发生在我身上。 (在Eclipse和shell中运行都有这种奇怪的行为)
如果我在shell中编译(javac Main.java),那么行为是正常的,即println版本较慢(大约1秒)。
所以Eclipse编译器有些奇怪吗?
代码:
import java.util.Random;
public class Main {
public static void main(String[] args) {
// Generate Data Matrix with random numbers
int ROWS = 10000;
int COLS = 40;
double[][] data = generateData(ROWS,COLS);
//Variables
long start_main;
long end_main;
// Time consuming function
start_main = System.nanoTime();
sequencialProcessData(data);
end_main = System.nanoTime();
System.out.println("main duration: " + (end_main - start_main)*Math.pow(10, -9) + " secs");
}
static double[][] sequencialProcessData(double[][] data) {
double[][] result = new double[data.length][data[0].length];
for(int col = 0; col < data.length; ++col) {
for(int row = 0; row < data[col].length; ++row) {
for(int i = 0; i <= row; ++i) {
result[col][row] += data[col][i];
}
}
}
// TRIGGER : COMMENT and UNCOMMENT THIS to see a difference in performance
// System.out.println("");
return result;
}
static double[][] generateData(int ROWS,int COLS) {
double[][] data = new double[COLS][ROWS];
Random random = new Random();
for(int col = 0; col < COLS; ++col) {
for(int row = 0; row < ROWS; ++row) {
data[col][row] = random.nextDouble();
}
}
return data;
}
}