0

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

}
4

0 回答 0