Как измерить скорость чтения файла без кеширования?

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

Оптимизация без бенчмаркинга не имеет смысла, поэтому я тестирую. Однако во время теста все содержимое файла кэшируется в ОЗУ, в отличие от реального запуска. Таким образом, время выполнения теста намного меньше и, скорее всего, не связано с реальностью.

Мне нужно как-то сказать ОС (Linux) не кэшировать содержимое файла или лучше очищать кеш перед каждым запуском теста. Или, может быть, использовать большую часть доступной оперативной памяти (32 ГБ), чтобы уместилась лишь малая часть содержимого файла. Как это сделать?

Я использую измеритель для тестирования производительности, но в данном случае я не считаю это необходимым (это ни в коем случае не микробенчмарк), и я не уверен, что это хорошая идея.


person maaartinus    schedule 23.07.2012    source источник
comment
Также было бы интересно решение для Windows   -  person Basj    schedule 14.03.2014


Ответы (2)


Очистить кеш файлов Linux

sync && echo 1 > /proc/sys/vm/drop_caches

Создайте большой файл, который использует всю вашу оперативную память

dd if=/dev/zero of=dummyfile bs=1024 count=LARGE_NUMBER

(не забудьте удалить dummyfile, когда закончите).

person Bruno Grieder    schedule 23.07.2012
comment
Последнее, вероятно, займет довольно много времени, и я не знаю, как исключить это время из результата теста. Первый, похоже, работает через suid perl-скрипт. - person maaartinus; 23.07.2012

Вы можете создать очень большой файл, а затем удалить его. Это очистит кеш диска.

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

В любом случае, вы тестируете производительность вашего оборудования. Чтобы улучшить это, вам нужно улучшить свое оборудование, вы можете сделать очень многое в программном обеспечении. например несколько потоков не заставят ваши диски вращаться быстрее. ;)


Windows NT http://research.microsoft.com/pubs/68479/seqio.doc

При последовательном сканировании NT делает запросы предварительной выборки размером 64 КБ.

Из Linux http://www.ece.eng.wayne.edu/~sjiang/Tsinghua-2010/linux-readahead.pdf

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

person Peter Lawrey    schedule 23.07.2012
comment
Да, это как раз то время, когда вы начинаете ставить твердотельные накопители повсюду. - person Bruno Grieder; 23.07.2012
comment
Даже использование контроллера диска с несколькими спиналами может помочь, но с SSD ваш предел - это емкость (или бюджет;), а не скорость. - person Peter Lawrey; 23.07.2012
comment
@ Питер Лоури: Несколько потоков не заставят мои диски вращаться быстрее, но один поток может выполнять предварительную выборку данных, поэтому обработка и вычисления могут перекрываться. При использовании RAID может быть хорошей идеей выполнить предварительную выборку нескольких файлов одновременно. Может быть оптимальный размер блока и т. Д. - person maaartinus; 23.07.2012
comment
Часто ОС достаточно умен, чтобы предварительно получить ваши данные, если вы читаете их последовательно, поэтому вам, возможно, не придется писать это самостоятельно (это самый быстрый способ загрузки данных) - person Peter Lawrey; 23.07.2012
comment
ОС не выполняет предварительную выборку данных из разных файлов, поэтому, если приложение относится к типу «прочитать файл, обработать его, прочитать следующий файл, обработать его», вы выиграете от параллелизма. - person sam; 26.07.2012
comment
@sam Microsoft и Linux, похоже, не согласны. Есть ли у вас какие-либо ссылки в поддержку этого? - person Peter Lawrey; 26.07.2012
comment
@ Питер Лоури: +1 за ссылки! ОС не может знать, какой файл я собираюсь открыть следующим, поэтому, по крайней мере, такая предварительная выборка может иметь смысл. В моем Linux я могу подтвердить, что предварительная выборка вручную при чтении однопоточного чтения вообще ничего не дает. Тесты с параллелизмом еще предстоит сделать. - person maaartinus; 28.07.2012