PHP性能file_get_contents()vs readfile()和cat

时间:2014-07-05 19:47:40

标签: php performance io cat

我正在使用PHP文件读取功能进行一些基准测试,仅仅是为了我的整体知识。 所以我测试了三种不同的方法来读取我认为非常快的文件的整个内容。

  • file_get_contents()因其高性能而闻名
  • readfile()在将数据直接输出到stdout
  • 时,已知是file_get_contents()的一个非常好的替代品。
  • exec(' cat filename')一个非常方便快捷的UNIX命令

所以这是我的基准测试代码,请注意我为readfile()启用了PHP缓存系统,以避免直接输出完全伪造结果。

<?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()不是&#34;尝试&#34; 将数据输出到{{1}但就像file_get_contents()一样,它会将数据放入RAM中。

我在这里寻找一个技术性的低级解释来理解stdoutfile_get_contents()的优点和缺点,除了一个被设计为直接写入stdout而另一个用于记忆的事实在RAM内部分配。

提前致谢。

1 个答案:

答案 0 :(得分:3)

file_get_contents只会将文件中的数据加载到内存中,而readfilecat都会在屏幕上输出数据,因此它们只会执行更多操作。

如果您想将file_get_contents与其他人进行比较,请在其前面添加echo

另外,你没有释放为$ foo分配的内存。如果你将file_get_contents作为最后一次测试移动,你可能会得到不同的结果。

此外,您正在使用输出缓冲,这也会产生一些差异 - 只需尝试在输出缓冲代码中添加其余功能以消除任何差异。

在比较不同的函数时,其余的代码应该是相同的,否则你会受到各种影响。