Я выполняю бенчмаркинг с функциями чтения файлов PHP только для моих общих знаний. Поэтому я проверил три разных способа чтения всего содержимого файла, который, как я думал, будет очень быстрым.
stdout
Итак, вот мой код бенчмаркинга, обратите внимание, что я включил систему кэширования PHP для readfile()
чтобы избежать прямого вывода, который полностью исказил бы результаты.
<?php /* Using a quick PNG file to benchmark with a big file */ /* file_get_contents() benchmark */ $start = microtime(true); $foo = file_get_contents("bla.png"); $end = microtime(true) - $start; echo "file_get_contents() time: " . $end . "s\n"; /* readfile() benchmark */ ob_start(); $start = microtime(true); readfile('bla.png'); $end = microtime(true) - $start; ob_end_clean(); echo "readfile() time: " . $end . "s\n"; /* exec('cat') benchmark */ $start = microtime(true); $bar = exec('cat bla.png'); $end = microtime(true) - $start; echo "exec('cat filename') time: " . $end . "s\n"; ?>
Я несколько раз запускал этот код, чтобы подтвердить показанные результаты, и каждый раз, когда у меня был тот же порядок. Вот пример одного из них:
$ php test.php file_get_contents() time: 0.0006861686706543s readfile() time: 0.00085091590881348s exec('cat filename') time: 0.0048539638519287s
Как вы видите, file_get_contents()
приходит первым, а затем readfile()
и, наконец, cat
Что касается cat
хотя это команда UNIX
(так быстро и все :)), я понимаю, что вызов отдельного двоичного файла может привести к относительному высокому результату. Но мне трудно понять, почему именно file_get_contents()
быстрее, чем readfile()
? Это примерно в 1,3 раза медленнее .
Обе функции встроены и, следовательно, довольно хорошо оптимизированы, и поскольку я включил кеш, readfile () не «пытается» выводить данные на stdout
но так же, как file_get_contents (), он будет помещать данные в ОЗУ.
Я ищу техническое объяснение низкого уровня здесь, чтобы понять плюсы и минусы file_get_contents()
и readfile()
кроме того, что один из них предназначен для прямой записи в stdout, тогда как другой выполняет выделение памяти внутри ОЗУ.
Заранее спасибо.
file_get_contents
загружает только данные из файла в памяти, в то время как оба readfile
и cat
также выводят данные на экране, поэтому они просто выполняют больше операций.
Если вы хотите сравнить file_get_contents
с остальными, добавьте echo
перед ним
Кроме того, вы не освобождаете память, выделенную для $ foo. Есть вероятность, что если вы переместите файл_get_contents в качестве последнего теста, вы получите другой результат.
Кроме того, вы используете буферизацию вывода, что также вызывает некоторую разницу – просто попробуйте добавить остальные функции в код буферизации вывода, чтобы удалить все различия.
При сравнении разных функций остальная часть кода должна быть одинаковой, иначе вы открыты для всех видов влияний.