Какой самый быстрый способ вывода строки в систему?

Я делаю что-то вроде этого:

for (int i = 0; i < 100000; i++) {
   System.out.println( i );
}

В принципе, я вычисляю целое число и вывожу строку около 10K-100K раз, а затем нужно записать результат в system.out, каждый результат разделяется новой строкой.

Какой самый быстрый способ достичь этого?

Ответ 1

Благодарим вас за предложения. Я создал тестовую программу для их сравнения:

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.lang.StringBuilder;

public class systemouttest {

    public static void main(String[] args) throws Exception {

        long starttime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
           System.out.println( i );
        }
        long printlntime = System.currentTimeMillis();

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            sb.append( i + "\n" );
        }
        System.out.print(sb.toString());
        long stringbuildertime = System.currentTimeMillis();

        OutputStream out = new BufferedOutputStream ( System.out );
        for (int i = 0; i < 100000; i++) {
            out.write((i + "\n").getBytes());
        }
        out.flush();
        long bufferedoutputtime = System.currentTimeMillis();

        BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
        for (int i = 0; i < 100000; i++) {
            log.write(i + "\n");
        }
        log.flush();
        long bufferedwritertime = System.currentTimeMillis();

        System.out.println( "System.out.println: " + (printlntime - starttime) );
        System.out.println( "StringBuilder: " + (stringbuildertime - printlntime) );
        System.out.println( "BufferedoutputStream: " + (bufferedoutputtime - stringbuildertime) );
        System.out.println( "BufferedWriter: " + (bufferedwritertime - bufferedoutputtime) );
    }

}

Результаты:

среды1
System.out.println: 482
StringBuilder: 210
BufferedoutputStream: 86
BufferedWriter: 202

Environment2
System.out.println: 1763
StringBuilder: 45
BufferedoutputStream: 76
BufferedWriter: 34

Все предложения выполнены лучше, чем System.out.println. BufferedOutputStream кажется самым безопасным выбором, так как он хорошо работает в обеих тестовых средах. BufferedWriter может быть быстрее, хотя.

Пожалуйста, напишите дополнительные предложения, если у кого есть какие-то идеи. Я уверен, что кто-то может ускорить это:)

Ответ 2

Для большого объема данных System.out.println может быть неэффективным, поскольку он не делают очень хорошую буферизацию. В этом случае вы можете использовать BufferedOutputStream или BufferedWriter.

Ответ 3

Имейте в виду, что операции ввода-вывода выполняются очень медленно по сравнению с обработкой в ​​памяти (например, синтаксический анализ Integer). Итак, я бы предложил вам создать целую строку "заранее", а затем распечатать ее только один раз (конечно, если это возможно):

StringBuilder sb = new StringBuilder();

for(int i = 0 ; i < 100000; i++) { sb.append(i).append("\n");}
String printMe = sb.toString(); 
System.out.println(printMe);

Существуют различные методы, такие как буферизация уровня используемого потока вывода, но я предполагаю, что вы предпочитаете оставаться с самым основным System.out.println

Надеюсь, что это поможет

Ответ 4

Самая медленная часть записи в System.out - это время, необходимое для отображения того, что вы пишете. т.е. для каждой строки, которую вы пишете, компьютер должен превращать информацию в пиксели с помощью шрифта и прокручивать всю строку. Это гораздо больше, чем вы, вероятно, будете делать, чтобы отображать текст.

Вы можете ускорить запись на консоль на

  • запись меньше (обычно лучшая идея)
  • запись в файл вместо этого (это может быть на 5-10 раз быстрее)