Java奇怪的行为:println经过的时间更快

时间:2014-02-25 15:09:56

标签: java time nanotime elapsed

我在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;
  }

}

0 个答案:

没有答案