file VS fread&preg_split

SeazoN

Guest
file VS fread&preg_split

Прочитал одну статью
http://php.spb.ru/php/speed.html

Значит там для извлечения строк в массив рулит однозначно file()
Хочу оспорить. Есть и др. варианты.
Там не рассматривался такой вариант
PHP:
<?php
require("Benchmark/Timer.php");
$time = new Benchmark_Timer;
$time -> setMarker('Start');;
$fp = fopen("access.log", "r");
$s  = preg_split("/\n/", fread($fp, filesize("access.log") ) ) ;
fclose($fp);
$time -> setMarker('fread'); 
$s = file("access.log");
$time -> setMarker('file'); 
$time -> setMarker('Stop');
$time -> display(); 
?>

time index ex time %
Start 1032607579.38473600 - 0.00%
fread 1032607579.52533100 0.140595 23.79%
file 1032607579.97568400 0.450353 76.19%
Stop 1032607579.97580900 0.000125 0.02%
total - 0.591073 100.00%

А тормознутость file объясняется скорей всего тем что она позволяет читать и с урла, где определить размер невозможно, приходится ставить условие и читать порциями

PS access.log 4Мб
 

Voxus

founder (Старожил PHPCluba)
у тебя ТОЧНО ничего не закэшировалось?
 

SeazoN

Guest
Ну а проверить религия не позволяет?
Даже если закэшировалось - что это меняет?
Наличие кэша у любой функции большой ПЛЮС. В данном случае у регэкспа. А за кэширование самого файла отвечает ОС. Тут обе функции в равных условия.
 

si

Administrator
А тормознутость file объясняется скорей всего тем что она позволяет читать и с урла, где определить размер невозможно
Не думаю что этим. А зачем сплитить регом, если есть explode ?
 

Eldar

Guest
Отчет об испытаниях.
Системы: Вин и Линукс, сервер: Апач.
Преимущество начинает быть заметным при размере файлов > 1 Мб.
 

RomikChef

Guest
Сезон, у Димы написано, что file однозначно рулит по сравнению с fgets.
А не просто однозначно.
Ну, а насчет explode надо его конечно попросить добавить пункт.
 

SeazoN

Guest
Вот так: explode("\n", $string);
Thanx
'\n' - уже второй раз накалываюсь ;-(
Преимущество начинает быть заметным при размере файлов > 1 Мб.
Не знаю, лично у меня вариант c explode(fread vs file) на мелких файлах 40%-60%, а чем больше файл - тем ближе к 20%-80%
 

Максим Деркачев

Guest
Отставание цикла с fgets от file происходит по фундаментальным причинам, а отставание file от explode(.. fread...) непонятно, потому что file, по идее, делает то же самое, только на уровне C, что всегда должно быть быстрее.
Подозреваю, что это отставание - просто дефект функции file (неоптимальный алгоритм).
Рано или поздно его могут залечить (возможно, сами присутствующие). Так что я бы не стал так сильно на это закладываться.
 

si

Administrator
Сезон, у Димы написано, что file однозначно рулит по сравнению с fgets.
А не просто однозначно.
Ну, а насчет explode надо его конечно попросить добавить пункт.
Эти тесты во местами не правильные и местами очень спорные. Я много раз это говорил Диме, но не думаю что он там чтото исправил.
 
Сверху