cpu: Intel Core Duo T2350 @ 1866.7 Mhz
ram: DDR2 2048 Mb, DRAM Frequency 266 Mhz, Dual Channel
hdd: Hitachi HTS541612J9SA00 (120 Gb, 5400 rpm, SATA), [ sector 512 byte ]
os: Win7 Ultimate
fs: NTFS (cluster 4Kb)
PHP Version 5.3.3 - MSVC6 (Visual C++ 6.0)
---
Суть тестирования:
Cоздаем кучу папок, в них кучу файлов с кодом <?php echo 'File-N'; /* ##...## */ ?>, где вместо N - порядковый номер файла, а вместо ... - комментарий заполняющий файл до нужного размера;
Важно: HDD и ОС при работе с файловой системой имеют свои абстрактные уровни кэширования.
Так в частности HDD кэширует куски данных у себя в локальном кэше, доступном лишь контроллеру HDD (в моем случае это 7 Мб), что прозрачно для тестирования уменьшает латентность доступа к данным, а ОС использует механизмы кэширования, задействуя RAM, следовательно, первый прогон более длителен, чем остальные (которые в 3-5 раз быстрее).
Таким образом, для объективности тестирования (для невозможности кэширования), каждый новый тестовый прогон, полностью удаляет все существующие файлы и директории и создает их заново, исключая возможность попадания секторов с данными в кэши. Что в тестах выражается стабильным временем отработки эквивалентным первоначальному запуску.
Исходный размер файла 51 байт (файл, в котором отсутствует довесок в виде коммента ##...##);
Далее буду описывать конфигурацию (кол-во директорий, кол-во файлов в них, размер файла);
---
Общее для группы измерений: Dir: 10; Files: 100; CPU Freq: 1866,7 Mhz (Bus: 133 Mhz)
Итого: 1000 файлов
filesize (Kb) avg.time (sec)
0,05 0,52
1 0,54
4 0,55
8 0,59
32 0,78
Время include и require в данном случае идентично, оно и понятно почему.
---
Общее для группы измерений: Dir: 10; Files: 100; CPU Freq: 2309,5 Mhz (Overclocked: Bus: 165 Mhz)
Итого: 1000 файлов
filesize (Kb) avg.time (sec)
0,05 0,41
1 0,42
4 0,44
8 0,466
32 0,62
---
Промежуточный вывод: в зависимости от увеличения объема данных увеличивается время их чтения при постоянной линейной скорости (в рамках цилиндра на HDD), т.к. запись файлов и создание директорий производятся практически линейно на физическом уровне хранения данных на HDD.
Картина была бы другой при произвольном расположении файлов, так как изменение их физического расположения потребовало бы серьезной поправки по времени на произвольный доступ к данным (что проверю чуть позже).
Также при росте частоты увеличивается производительность системных операций, обслуживающих I/O, поэтому в определенной пропорции росту частоты уменьшается время выполнения теста (точнее уменьшение времени связано с ускорением части процессорозависимых системных вызовов).
---
Тест с произвольным размером файлов: от 512 байт до 32 Кб
CPU Freq: 1866,7 Mhz
avg.filesize (Kb) time (sec)
15,97 0,663
16,06 0,949
16,29 0,646
16,25 0,734
16,29 0,654
---
CPU Freq: 2309,5 Mhz
avg.filesize (Kb) time (sec)
15,83 0,516
16,25 0,848
16,16 0,539
15,99 0,522
16,20 0,800
---
А теперь сгенерируем файлы случайного размера, затем сольем их в один единственный исполнительный файл:
CPU Freq: 1866,7 Mhz
avg.filesize (Kb) time (sec) include once file (sec) all/once
16,57 0,735 0,225 3,26
15,89 0,645 0,192 3,36
16,66 0,654 0,226 2,89
---
CPU Freq: 2309,5 Mhz
avg.filesize (Kb) time (sec) include once file (sec) all/once
16,41 0,521 0,182 2,86
15,94 0,526 0,156 3,37
16,09 0,528 0,155 3,40
---
Всем приятного просмотра.
пойду тестировать Sandy Bridge (Core-i5 2300 @ 3.7 Ghz) и зависимость латентности от более современных HDD с NCQ и т.д. (500, 750, 1500 Gb / 5400rpm / 7200rpm).