Как буфер и очистка используются в PrintStream? - PullRequest
1 голос
/ 27 мая 2019

Вопрос на PrintStream буферизуется, но очистка не снижает производительность, а BufferedOutputStream повышает производительность пишет, что

PrintStream буферизируется путем добавления операции очистки после каждой печати(), быстродействие должно значительно ухудшиться, но это вовсе не так, как показано в приведенном ниже фрагменте кода.

// PrintStream is buffered but takes 4228ms to complete
long start = System.currentTimeMillis();
try (PrintStream ps = new PrintStream(new FileOutputStream("1.txt") ))
{
    for (int i = 0; i < 1_000_000; i++) {
        ps.print(i + " ");
    }
}
long stop = System.currentTimeMillis();
System.out.println(stop - start);

 // PrintStream is buffered, but with auto-flush takes 4140ms to complete, no degraded speed implying flush did nothing
start = System.currentTimeMillis();
try (PrintStream os = new PrintStream(new FileOutputStream("1.txt") ))
{
    for (int i = 0; i < 1_000_000; i++) {
        os.print(i + " ");
        os.flush();
    }
}
stop = System.currentTimeMillis();
System.out.println(stop - start);

В ответе на https://stackoverflow.com/a/42682673/10082400 написано, что:

Хотя внутренние элементы PrintStream "буферизируются", метод записи сбрасывает внутренние буферы в базовый поток на каждом write().

внутренние "буферы" действительно предназначены для преобразования символов в байты

В реализации PrintStream, в частности write(),print() и println(), я вижу, что все методы записи вызывают flush(), только когда autoFlush истинно и условие, которое оно представляет, истинно.Это противоречит "методу записи, сбрасывающему внутренние буферы в базовый поток на каждом write()" в ответе?

Я также вижу, что PrintStream косвенно использует буфер в его BufferedWriter поле textOut.Где внутренний буфер PrintStream его собственный?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...