如何在Java中优化此嵌套的for循环?

时间:2020-02-09 14:52:20

标签: java

for (int i = 0 ; i < row ; i++){
        for (int k = 0 ; k < col ; k++) {
            System.out.print("\t" + mat[i][k]);
        }

我的目标是减少大量行和列的执行时间

3 个答案:

答案 0 :(得分:3)

我没想到这一点,但是艾略特的评论是正确的。巴希尔,你问一个例子,这里是:

public class Main
{

    private static void test()
    {
        int row = 1000;
        int col = 1000;
        int mat[][] = new int[row][col];

        StringBuilder buffer=new StringBuilder();

        for (int i = 0; i < row; i++)
        {
            for (int k = 0; k < col; k++)
            {
                //System.out.print("\t" + mat[i][k]);

                //System.out.print('\t');                
                //System.out.print(mat[i][k]);

                buffer.append('\t');
                buffer.append(mat[i][k]);
            }
        }
        System.out.println(buffer.toString());
    }

    public static void main(String[] args)
    {
        long start = System.currentTimeMillis();
        test();
        long end = System.currentTimeMillis();
        System.err.println("Test took " + (end - start) + "ms");
    }
}

我在Linux上(在Linux上)执行了它,以确保终端窗口或图形卡的性能不会影响测量:

java Main > /dev/null

缓冲版本的运行速度比原始版本快30倍。

答案 1 :(得分:1)

每个System.out.println都需要时间来执行。当前,在您的代码中,您正在对每个元素进行System.out.println 我们可以通过对每一行而不是对每一列进行System.out.println来将其减少到几乎四分之一

注意:

如果您事先知道代码中有多少行和多少列,则可以进行进一步的优化。如果行和列的基数存在重大差异,则可以使用较低的基数值运行外循环。

您可以看到以下提到的代码:

StringBuilder sb=new StringBuilder();
for(int i=0; i<row; i++) 
{

    for(int j=0; j<col; j++) 
    {
        sb.append('\t');    
        sb.append(mat[i][j]);
    }
    sb.append('\n');
}
System.out.println(sb.toString());

答案 2 :(得分:0)

如果仅打算打印二维数组,则可以使用Arrays.deepToString。但是,您打算以上述格式打印它,但仍然希望减少I / O操作,可以使用StringBuilder生成一个字符串并进行打印。请注意,这两个选项都会占用您的内存。第一个选项内部使用StringBuilder,而第二个选项中,您将使用StringBuilder自己构建字符串。因此,这是I / O操作数与内存利用率的对比。

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[][] mat = { { 10, 20 }, { 40, 30 } };

        System.out.println(Arrays.deepToString(mat));

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < mat.length; i++) {
            for (int k = 0; k < mat[0].length; k++) {
                sb.append("\t" + mat[i][k]);
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }
}

输出:

[[10, 20], [40, 30]]
    10  20
    40  30