我在 Java 中看到了一些奇怪的行为:
注释 aprintln
会使函数执行速度变慢。
取消注释println
会使函数执行得更快。
我希望这会被扭转,因为println
应该花费时间。
触发器是函数System.out.println("");
中的。
注释行后,我得到 2.5 秒。
在未注释该行的情况下,我得到 1.9 秒。sequentialProcessData
该行为独立于使用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;
}
}