代码之家  ›  专栏  ›  技术社区  ›  Nick Jurista

是在单独的行上使用fseek()fread()更好,还是在整个文件和子字符串上使用fread()更好?

  •  2
  • Nick Jurista  · 技术社区  · 14 年前

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

    $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()。我唯一想知道的是,如果在1000000字节中加载是不是过度了,而实际上只提取了大约100个总字节(在文件的中间,所有字节相对接近)。

    那么哪种代码的性能会更好呢?使用哪种代码更有意义?请迅速解释一下。

    3 回复  |  直到 14 年前
        1
  •  4
  •   robmerica    14 年前

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

        2
  •  3
  •   Guffa    14 年前

    文件是以集群为单位读取的,集群通常大约为8kb。通常有几个集群是预先读取的。

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

    如果文件比您的示例大得多,则只需读取少数集群,因此第一个方法的性能应该更好。最坏情况下,所有数据仍将从磁盘读取,但应用程序仍将使用较少的内存。

        3
  •  1
  •   Martin Wickman    14 年前

    似乎寻找你想要的位置,然后只读取你需要的字节是最好的方法。

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