powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Оптимальный размер буфера ввода вывода
19 сообщений из 19, страница 1 из 1
Оптимальный размер буфера ввода вывода
    #38682918
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test.java
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class test {
  public static void main( String[] args ) throws java.io.IOException {
    final int BUF_SIZE = 1 << Integer.parseInt( args[0] );
    int i;
    byte[] buf = new byte[BUF_SIZE];
    long start = System.nanoTime();
    while ( -1 < ( i = System.in.read( buf ) ) ) System.out.write( buf, 0, i );
    System.err.println( "Buffer (" + BUF_SIZE + "): " + (System.nanoTime() - start + 500000) / 1000000 );
  }
}



Создаём файл (contig -n zero 100000000) и проверяем ...
"только чтение":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for /l %A in (10 1 20) do @java -server test %A < zero > nul
Buffer (1024): 184
Buffer (2048): 163
Buffer (4096): 135
Buffer (8192): 125
Buffer (16384): 91
Buffer (32768): 73
Buffer (65536): 66
Buffer ( 131072 ): 63
Buffer (262144): 108
Buffer (524288): 117
Buffer (1048576): 196

"чтение/запись":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for /l %A in (10 1 20) do @java -server test %A < zero > zero.out
Buffer (1024): 585
Buffer (2048): 474
Buffer (4096): 345
Buffer (8192): 250
Buffer (16384): 189
Buffer (32768): 161
Buffer (65536): 142
Buffer ( 131072 ): 122
Buffer (262144): 167
Buffer (524288): 186
Buffer (1048576): 255

Нет смысла делать буфер более 128Кб.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38682928
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень сомнительный тест. Вы что вообще в нем проверяете? Скорость записи в файл? А может быть скорость записи в std i/o? Или реализацию вывода в стандартные стримы в Hotspot? Или как в вашей операционке реализованы потоки консольного ввода/вывода?
Надо смотреть с нормально созданным файлом через FileInput/OutputStream, что бы исключить все упомянутое выше.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38682931
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да бога ради:
файловый ввод-вывод
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class test {
  public static void main( String[] args ) throws java.io.IOException {
    final int BUF_SIZE = 1 << Integer.parseInt( args[0] );
    int processed = 0, i;
    byte[] buf = new byte[BUF_SIZE];
    long start = System.nanoTime();
    java.io.InputStream in = new java.io.BufferedInputStream( new java.io.FileInputStream( args[1] ) );
    java.io.OutputStream out = new java.io.BufferedOutputStream( new java.io.FileOutputStream( args[1] + ".out" ) );
    while ( -1 < ( i = in.read( buf ) ) ) {
      processed += i;
      out.write( buf, 0, i );
    }
    in.close();
    out.close();
    System.err.println( "Buffer (" + BUF_SIZE + "): " + processed + " byte read in " + (System.nanoTime() - start + 500000) / 1000000 + " ms" );
  }


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for /l %A in (10 1 20) do @java -server test %A zero
Buffer (1024): 100000000 byte read in 316 ms
Buffer (2048): 100000000 byte read in 318 ms
Buffer (4096): 100000000 byte read in 359 ms
Buffer (8192): 100000000 byte read in 277 ms
Buffer (16384): 100000000 byte read in 207 ms
Buffer (32768): 100000000 byte read in 174 ms
Buffer (65536): 100000000 byte read in 150 ms
Buffer ( 131072 ): 100000000 byte read in 142 ms
Buffer (262144): 100000000 byte read in 190 ms
Buffer (524288): 100000000 byte read in 210 ms
Buffer (1048576): 100000000 byte read in 276 ms

Прикладной буфер всё равно уменьшает время копирования.
Размер буфера всё равно нет смысла делать более 128 Кб.
В сухом остатке: прежний вывод остаётся в силе.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38682941
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovфайловый ввод-вывод
/**
* {@link java.io.BufferedInputStream#buf}
* {@link java.io.BufferedOutputStream#buf}
* ;)
*/
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38682943
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже ёрничал насчёт общей эрудиции и банальной логики, но расшифрую: буферизированный поток ввода-вывода может быть и, весьма вероятно, будет хуже прикладного буфера.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38682948
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант, который в зависимости от параметров может использовать или стандартные описатели ввода-вывода или именованные файлы:
test.java
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public class test {
  public static void main( String[] args ) throws java.io.IOException {
    final int BUF_SIZE = 1 << Integer.parseInt( args[0] );
    int i;
    long processed = 0;
    byte[] buf = new byte[BUF_SIZE];
    long start = System.nanoTime();
    java.io.InputStream in;
    java.io.OutputStream out;
    switch ( args.length ) {
    case 3:
      in = new java.io.FileInputStream( args[1] );
      out = new java.io.FileOutputStream( args[1] + args[2] );
      break;
    case 2:
      in = new java.io.FileInputStream( args[1] );
      out = System.out;
      break;
    default:
      in = System.in;
      out = System.out;
    }
    while ( -1 < ( i = in.read( buf ) ) ) {
      processed += i;
      out.write( buf, 0, i );
    }
    in.close();
    out.close();
    System.err.println( "Buffer (" + BUF_SIZE + "): " + processed + " byte copied in " + (System.nanoTime() - start + 500000) / 1000000 + " ms" );
  }
}

...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38683230
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю что результат этого теста нужно записывать в многомерную матрицу.
IO на файлах скорее всего платформозавизим. И я-бы добавил dimension
по {Solaris, Windows, Linux, OS X}.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38683242
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для счастливых обладателей JDK8/Java8 алмазным резцом выбито в граните магическое число
восемь тыщ сто девяносто два.

Files.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
// buffer size used for reading and writing
....
private static final int BUFFER_SIZE = 8192;

.....

/**
     * Reads all bytes from an input stream and writes them to an output stream.
     */
    private static long copy(InputStream source, OutputStream sink)
        throws IOException
    {
        long nread = 0L;
        byte[] buf = new byte[BUFFER_SIZE];
        int n;
        while ((n = source.read(buf)) > 0) {
            sink.write(buf, 0, n);
            nread += n;
        }
        return nread;
    }
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38683269
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Счастливые обладатели Java8 могут проверить: действительно ли 8Кб - магическое число :))
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38683348
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Интересно было бы ещё посмотреть FileChannel transfer в схожих условиях.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38683414
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ломы. Тем более, что разница будет в пределах погрешности.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38683514
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovСчастливые обладатели Java8 могут проверить: действительно ли 8Кб - магическое число :))
Думаю что старый пьяница Гослинг знает ответ. :)
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38683535
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДумаю что старый пьяница Гослинг знает ответ. :)
Дык это, вроде, распространенный размер, не только в Java.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38683711
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтение блоками по 8 и 128 килобайт - одинаково в пределах погрешности:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 for /l %C in (0 1 4) do @for %A in (13 17) do @for %B in (01 10) do @java -server test %A < %Be9 > nul
 Buffer (8192): 1000000000 byte copied in 984 ms
 Buffer (8192): 10000000000 byte copied in 9350 ms
 Buffer (131072): 1000000000 byte copied in 985 ms
 Buffer (131072): 10000000000 byte copied in 9099 ms
 Buffer (8192): 1000000000 byte copied in 972 ms
 Buffer (8192): 10000000000 byte copied in 9358 ms
 Buffer (131072): 1000000000 byte copied in 973 ms
 Buffer (131072): 10000000000 byte copied in 9340 ms
 Buffer (8192): 1000000000 byte copied in 976 ms
 Buffer (8192): 10000000000 byte copied in 9276 ms
 Buffer (131072): 1000000000 byte copied in 945 ms
 Buffer (131072): 10000000000 byte copied in 9129 ms
 Buffer (8192): 1000000000 byte copied in 966 ms
 Buffer (8192): 10000000000 byte copied in 9164 ms
 Buffer (131072): 1000000000 byte copied in 894 ms
 Buffer (131072): 10000000000 byte copied in 9147 ms
 Buffer (8192): 1000000000 byte copied in 971 ms
 Buffer (8192): 10000000000 byte copied in 9195 ms
 Buffer (131072): 1000000000 byte copied in 992 ms
 Buffer (131072): 10000000000 byte copied in 9163 ms
Скорость на уровне гигабайта в секунду заставляет предположить, что система "пометила" файл, как "содержащий только нули" и с диска читает только эту метаинформацию

А вот на записи 128Кб вполне стабильно выигрывает:
Код: plaintext
1.
2.
3.
4.
 for %A in (13 17) do @for %B in (01 10) do @java -server test %A < %Be9 > %Be9.out
 Buffer (8192): 1000000000 byte copied in 15789 ms
 Buffer (8192): 10000000000 byte copied in 285233 ms
 Buffer (131072): 1000000000 byte copied in 14786 ms
 Buffer (131072): 10000000000 byte copied in 244507 ms
стабильные ~70Мб/сек.
Собственно, если бы с диска читались реальные данные - 128К выиграл бы ещё чуть-чуть.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38683868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, брадт. Это мистификасьон!
Давай выведи в консоль следующие проперти:

Код: java
1.
2.
3.
4.
5.
6.
java.version=
java.vm.info=
java.vm.name=
os.arch=
os.name=
os.version=



и попросим мемберов погонять бенчмарки на разных конфигурациях ОС+Filesystem.

У меня к сожалению пока тоже винда. Но надеюсь кто-то одарит нас экзотикой.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38684291
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот чтение без разреженности (файл забит мусором из 128Кб буфера):

Код: plaintext
1.
2.
3.
4.
5.
for %A in (13 17) do @java -server test %A < nonzero > nul
Buffer (8192): 14992408576 byte copied in 356012 ms
Buffer (131072): 14992408576 byte copied in 345586 ms

Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

Как я и обещал, 128Кб немного быстрее. Win7sp1, шесть гигабайт, два ядра, старенький SATA 120Гб.

P.S. Насколько я понимаю, ввод-вывод сейчас сильно унифицирован, поэтому качественно результаты не будут зависеть от системы.
Хотя могут зависеть от рантайма - как помнится, на JDK6 чтение разреженных файлов (без NIO) в скорости не прибавляло.
Но это меня может глючить.
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38687104
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЯ уже ёрничал насчёт общей эрудиции и банальной логики, но расшифрую: буферизированный поток ввода-вывода может быть и, весьма вероятно, будет хуже прикладного буфера.
Не верю ( C )

Там такой-же "прикладной буфер". Ничем не лучше и не хуже. Если декомпилировать, то код вполне вменяемый (сомневаюсь, что средний программист с форума напишет лучше, скорее хуже).

Нормальный JIT компилятор, вызовы методов раскрывает (inline) в динамике. Т.ч. разница на какой глубине вложенности вызовов процедур создается буфер, тоже особой нет.

IMHO & AFAIK

Basil A. SidorovНет смысла делать буфер более 128Кб.
Сомнительный вывод.

1. Сильно In-depend от ОС и железа.
2. Для высоконагруженных задач с большим объемом данных - IMHO чем больше, тем лучше. И всякие тесты по боку.

Вроде, в Windows, _максимальный_ размер около 1 Mb (сейчас или было недавно). А вот выше этого размера может наоборот начать производительность падать (в ед. измерения "байты в секунду").

Note 1: лично я обычно ставлю размер буфера в районе 32 k. AFAIK от 16 до 64-128 разница не так уж и заметна. А по старой привычки пытаюсь в int (16 бит) поместиться )))
Note 2: например при прикладной задаче "копирование файла", важно не столько минимизация обращения к системе, сколько кол-во раз дерганей (перепозиционирования) головки на диске. Т.е. чем больше буфер, тем лучше. Тут уж можно и гигабайты захотеть )))
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38687118
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, еше и algorithm depends.

Если мы работаем в B+Tree индеком на диске то оптимальная единица I/O это страница
индекса (классика = 4..8 килобайт).
...
Рейтинг: 0 / 0
Оптимальный размер буфера ввода вывода
    #38687266
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНе верю ( C )И не надо - я выложил исходные тексты и результаты.
Если вас есть более другие результаты, выкладывайте - обсудим.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Оптимальный размер буфера ввода вывода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]