【问题标题】:efficiency of loop through a 2d array horizontally or vertically水平或垂直循环通过二维数组的效率
【发布时间】:2013-12-07 22:29:12
【问题描述】:

我阅读了 4 年前在 stackoverflow 上发表的一篇文章,请参见此处: Fastest way to loop through a 2d array? 几乎每个答案都同意水平扫描会更快。我编写了一个简短的 Java 程序来检查这一点,但事实并非如此。我选择 400x400 矩阵。水平扫描时间为 6,垂直扫描时间为 3。我检查了其他尺寸的矩阵。事实证明,垂直扫描速度更快。我错过了什么还是确实如此?

public class Test {

public static void main(String[] args) {

        int row=Integer.parseInt(args[0]);
    int column=Integer.parseInt(args[1]);
    int[][] bigarray=new int[row][column];

    long startTime = System.currentTimeMillis();
    for(int i=0;i<row;i++)
        for(int j=0;j<column;j++)
            bigarray[i][j]=Math.abs(i-j)-Math.abs(i-j);


    long endTime   = System.currentTimeMillis();
    long totalTime = endTime - startTime;
    System.out.println("scan horizentally time is: ");
    System.out.println(totalTime);

    int[][] bigarray1=new int[row][column];

    long startTime1 = System.currentTimeMillis();
    for(int j=0;j<column;j++)
        for(int i=0;i<row;i++)
            bigarray1[i][j]=Math.abs(i-j)-Math.abs(i-j);


    long endTime1   = System.currentTimeMillis();
    long totalTime1 = endTime1 - startTime1;
    System.out.println("scan vertically time is: ");
    System.out.println(totalTime1);

}

}

【问题讨论】:

  • 首先,要测量时间,您应该使用System.nanoTime 而不是System.currentTimeMillis,因为前者更准确。其次,参考这个链接可以更好地了解微基准测试:stackoverflow.com/q/504103/1065197
  • 我对你的大矩阵结果有点好奇;在我的机器上,400x400 有利于垂直,但优势迅速下滑:4000x4000 是一个非常不同的故事。
  • 是的,如果我检查 4000x4000 或更大的矩阵,那么水平扫描会更快。这很有趣!
  • 我用nano时间修改了代码,结果和之前差不多。对于小尺寸或中等尺寸矩阵,水平扫描速度较慢。如果使用足够大的矩阵,情况就会改变。
  • 交换代码中的case,看看是否得到相同的结果?

标签: java multidimensional-array


【解决方案1】:

横版可以优化代码:

for(int i=0;i<row;i++)
    int[] rowArray = bigarray[i];
    for(int j=0;j<column;j++)
        rowArray[j]=Math.abs(i-j)-Math.abs(i-j);

如果您的测试设置总是较慢,我不会感到惊讶。 Java 需要很多预热时间...更好的测试设置可能是有两个单独的程序,并在花时间之前进行一些预热循环...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2020-10-08
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多