Чтение файла file() быстрее, чем fopen+цикл – ускорение 40%
Для того, чтобы прочитать в массив $x файл размером 1Мб (100 000 строк по 10 байт) можно воспользоваться двумя вариантами: чтение файла с помощью file(), либо традиционным методом fopen/fgets. Разумеется, для файлов разного объема и содержимого скорость может меняться. Но в данном примере статистика такова:file("1Mb_file.txt") работает на 40% быстрее, чем:
$f=fopen("1Mb_file.txt","r") or die(1); while($x[]=fgets($f,1000)); fclose($f); |
Аналогичные варианты
$f=fopen("1Mb_file.txt","r") or die(1); while($s=fgets($f,1000)) $x[]=$s; fclose($f); |
или
$f=fopen("1Mb_file.txt","r") or die(1); while(!feof($f))) $x[]=fgets($f,1000); fclose($f); |
работают еще медленнее (во втором случае лишняя функция feof() заметно снижает скорость). Тот же тест, но на 15Мб файле (100 000 строк по 150 байт) показывает разницу в 50%, в пользу file(). Тест проводился так, чтобы исключить фоновый своппинг во время работы из-за предшествующих команд создания/чтения таких больших файлов. Подсчитать тоже самое на очень маленьких файлах в 1-2 Кб не представляется возможным, т.к. операцию чтения нельзя повторять в течении одного теста, операции чтения будут кешироваться…