Файл производительности 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(), помимо того факта, что один предназначен для записи непосредственно в стандартный вывод, в то время как другой выполняет выделение памяти внутри ОЗУ.

Заранее благодарю.

Author: Valentin Mercier, 2014-07-05

1 answers

file_get_contents загружает только данные из файла в память, в то время как readfile и cat также выводят данные на экран, поэтому они просто выполняют больше операций.

Если вы хотите сравнить file_get_contents с другими, добавьте echo перед ним

Кроме того, вы не освобождаете память, выделенную для $foo. Есть вероятность, что если вы переместите file_get_contents в качестве последнего теста, вы получите другой результат.

Кроме того, вы используете буферизацию вывода, что также вызывает некоторые различия - просто попробуйте добавить остальные функции в код буферизации вывода, чтобы устранить любые различия.

При сравнении различных функций остальная часть кода должна быть одинаковой, в противном случае вы открыты для всех видов влияний.

 3
Author: Maxim Krizhanovsky, 2014-07-06 09:29:00