Php 在单个行上使用fseek()fread()更好,还是在整个文件和substr上使用fread()更好?

Php 在单个行上使用fseek()fread()更好,还是在整个文件和substr上使用fread()更好?,php,optimization,performance,fread,Php,Optimization,Performance,Fread,为了更清楚地说明这一点,我将放置代码示例: $file = fopen('filename.ext', 'rb'); // Assume $pos has been declared // method 1 fseek($file, $pos); $parsed = fread($file, 2); // method 2 while (!feof($file)) { $data = fread($file, 1000000); } $data = bin2hex($data);

为了更清楚地说明这一点,我将放置代码示例:

$file = fopen('filename.ext', 'rb');

// Assume $pos has been declared
// method 1
fseek($file, $pos);
$parsed = fread($file, 2);

// method 2
while (!feof($file)) {
    $data = fread($file, 1000000);
}

$data = bin2hex($data);
$parsed = substr($data, $pos, 2);

$fclose($file);
方法1中大约有40个fread()(可能有15个fseek()),而方法2中只有1个fread()。我唯一想知道的是,当你真的只提取100个总字节(在文件中间的所有相对接近的字节)时,加载1000000字节是多余的。


那么,哪种代码的性能会更好呢?使用哪种代码更有意义?如果您已经知道要查找的偏移量,fseek是最好的方法,因为如果您只需要几个字节,就没有理由将整个文件加载到内存中。第一种方法更好,因为您可以直接跳到文件流中所需的内容,并读取一小部分内容。第二种方法要求您将整个文件读取到内存中,然后在可以直接从文件中读取的情况下进行查找。希望这能回答您的问题

文件是以集群为单位读取的,集群通常大约为8KB。通常会预读一些集群

因此,如果文件只有几kb,那么使用fseek与读取整个文件相比几乎没有什么好处。文件系统仍将读取整个文件


如果文件相当大(如您的情况),则只需读取少数集群,因此第一种方法的性能应该更好。在最坏的情况下,所有数据仍将从磁盘读取,但应用程序仍将使用更少的内存。

看来,寻找所需位置,然后只读取所需的字节是最好的方法


但正确的答案是(一如既往地)测试它的真实性,而不是猜测。在服务器环境中运行两个示例,并进行一些时间测量。还要检查内存使用情况。一旦你有一些硬数据要备份,就进行优化。

o如果你需要整个文件-最终-(例如,你检查每个字节,在100字节块中),如果文件不太大,读取所有文件的速度会更快-最多可达数兆字节。否则,您就有可能填满RAM,进入交换空间,并将一切都拖慢到爬行状态。