如何减少System.out.println();

时间:2017-01-18 13:44:20

标签: java performance io

我在列表中插入2_000_000个长值。每次插入时,我都需要使用SOP将列表的大小打印到控制台。如果我没有打印尺寸到控制台插件完成250毫秒。如果我每次插入一个值时打印尺寸,则所用时间为25000毫秒。

我知道如何解决这个性能问题?

我正在使用Java7和Eclipse(kepler)来测试我的实现。

注意:每次插入长值时打印大小都是必需的,并且是问题定义所必需的。

2 个答案:

答案 0 :(得分:3)

尝试使用BufferedWriter。它允许有效的字符编写。 另外,不要忘记最后调用flush方法,以便输出所有缓冲的数据。

工作示例:

    List<Long> list = new ArrayList<>();
    try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
        for(long i = 0; i < 2000000; i++) {
            list.add(i);
            bw.write("Current size:" + list.size());
            bw.newLine();
            if(i % 100 == 0 || i == 1999999) {
                bw.flush();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

第二种选择可能是使用StringBuilder

    List<Long> list = new ArrayList<>();
    String separator = System.getProperty("line.separator");
    int initialCapacity = 200000;
    StringBuilder sb = new StringBuilder(initialCapacity);
    for (long i = 0; i < 2000000; i++) {
        list.add(i);
        sb.append("Current size:").append(list.size()).append(separator);
        if (i % 10000 == 0 || i == 1999999) {
            System.out.println(sb);
            sb = new StringBuilder(initialCapacity);
        }
    }

答案 1 :(得分:0)

例如

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
for (long myLong : values)
{
    list.add(myLong);
    writer.write(list.size());
}

完成后,或者每1000次插入完成后,请致电

writer.flush();