Файл производительности PHP получает содержимое() против readfile() и cat
Я провожу некоторый сравнительный анализ с функциями чтения файлов PHP только для моих общих знаний. Поэтому я протестировал три разных способа чтения всего содержимого файла, которые, как я думал, будут очень быстрыми.
- file_get_contents() хорошо известен своей очень высокой производительностью
- readfile(), как известно, является очень хорошей альтернативой file_get_contents(), когда дело доходит до вывода данных непосредственно в
stdout
- exec('имя файла кошки') один очень удобный и быстрый UNIX команда
Итак, вот мой код для сравнительного анализа, обратите внимание, что я включил систему кэширования 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()
, помимо того факта, что один предназначен для записи непосредственно в стандартный вывод, в то время как другой выполняет выделение памяти внутри ОЗУ.
Заранее благодарю.
1 answers
file_get_contents
загружает только данные из файла в память, в то время как readfile
и cat
также выводят данные на экран, поэтому они просто выполняют больше операций.
Если вы хотите сравнить file_get_contents
с другими, добавьте echo
перед ним
Кроме того, вы не освобождаете память, выделенную для $foo. Есть вероятность, что если вы переместите file_get_contents в качестве последнего теста, вы получите другой результат.
Кроме того, вы используете буферизацию вывода, что также вызывает некоторые различия - просто попробуйте добавить остальные функции в код буферизации вывода, чтобы устранить любые различия.
При сравнении различных функций остальная часть кода должна быть одинаковой, в противном случае вы открыты для всех видов влияний.