Производительность PHP file_get_contents () vs readfile () и cat

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

  • file_get_contents () хорошо знает свою очень высокую производительность
  • readfile () известен как очень хорошая альтернатива file_get_contents (), когда дело доходит до вывода данных непосредственно на stdout
  • exec ('cat filename') одна очень удобная и быстрая команда 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() кроме того, что один из них предназначен для прямой записи в stdout, тогда как другой выполняет выделение памяти внутри ОЗУ.

Заранее спасибо.

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

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

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

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

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