Калининград+7.962.2626.555

Скорость работы функций fgets(), file(), file_get_contents(), fread()

12.01.2012

Чтобы прочитать текстовую информацию из файла можно использовать, по крайней мере, 4 функции: fgets(), file(), file_get_contents(), fread(). Первая, конечно, явный аутсайдер. Но все же интересно посмотреть на время выполнения одной и той же задачи этими функциями.

Итак, берем файл размером 50Мб и поочередно просто начинаем читать его содержимое.

1. Для функции fgets() использовался такой цикл:

$rHandle = fopen($file,'r');
while (!feof($rHandle)) {
    $str = fgets($rHandle);
};
fclose($rHandle);

2. Для функции file() просто:

$Array = file($file);

3. То же для file_get_contents():

$content = file_get_contents($file);

4. Функция  fread() вызывалась так:

$rHandle = fopen($file,'r');
$content = fread($rHandle, filesize($file));
fclose($rHandle);

Вот результаты выполнения:

Функция Время выполнения
fgets() 1.0536
file() 0.6769
file_get_contents() 0.1257
fread() 0.0923


Как и ожидалось цикл с fgets() оказался худшим вариантом. Функции file_get_contents() и fread() показали похожий результат, и, не смотря на то, что fread() оказалась в данном случае быстрее, официальная документация рекомендует использовать file_get_contents(), потому что эта функция работает по некому алгоритму «memory mapping» (если тот поддерживается ОС). Будем верить ТД.

Однако, тест получился все же нечестный, потому что результатом выполнения file_get_contents() и fread() стали просто строки, а функция file() вернула целый массив. Поэтому было бы интересно переделать строку в аналогичный массив, добавив:

$Array = explode(chr(13).chr(10),$content);

Вот результат (время выполнения функции file() просто перенесли в эту таблицы из прошлой):

Функция Время выполнения
file() 0.6769
file_get_contents() 0.6439


Результат неоднозначный: с одной стороны мы говорим о файле в 50Мб (часто ли приходится читать файлы такого объема), с другой стороны это результат одного лишь обращения (если при одном запросе мы выигрываем 0.033 секунды, то всего 30 запросов экономят целую секунду).

Также были проведены тесты с файлом в 0.5Мб и при малых количествах повторений цикла преимущество все же было на стороне функции file_get_contents() с последующей explode(). И лишь когда количество повторений цикла превысило 1000, то функция file() наконец-то вышла в лидеры:

Функция Время выполнения
file() 9.5285
file_get_contents() 9.9103