zoukankan      html  css  js  c++  java
  • PHP中fwrite与file_put_contents性能测试

     

    这里测试的是往文件中写一百万行记录,如果数据量很小,比如1000条左右的记录,可能差距不大。

    function microtimeFloat() {
        list($usec,$sec) = explode(" ", microtime());
        return((float)$usec + (float)$sec);
    }

    1.测试file_put_contents
    <?php
    $userCount = 1000;
    $itemCount = 1000;
    $file = 'ratings.txt';
    file_exists($file) &&unlink($file);

    $timeStart = microtimeFloat();
    for ($i = 0; $i < $userCount; $i++) {
        $uid =random(32);
        for ($j = 0;$j < $itemCount; $j++) {
           $itemId = mt_rand(1, 300000);
           $rating = $j == 0 ? 1 : mt_rand(1, 100) / 100;
           $line = sprintf("%s,%d,%s ", $uid, $itemId, $rating);
           file_put_contents($file, $line, FILE_APPEND);
        }
    }
    $timeEnd = microtimeFloat();
    echo sprintf("Spend time: |%s| second(s) ", $timeEnd -$timeStart);
    ?>

    测试结果:
    测试过程中出现了打开文件的错误,而且程序执行完成以后写入的数据不完整,只有999997行,漏了3行。最重要的一点是时间花了307秒多,而用fwrite只花了10秒多的时间,差距还是不小的。

    D:myphp esearch>php test2.php
    PHP Warning: file_put_contents(ratings.txt): failed to open stream:Permission
    denied in D:myphp esearch est2.php on line 79

    Warning: file_put_contents(ratings.txt): failed to open stream:Permission denie
    d in D:myphp esearch est2.php on line 79
    Spend time: |307.0586669445|second(s)

    ...
    999994:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,167670,0.15
    999995:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,234223,0.13
    999996:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,84947,0.79
    999997:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,6489,0.38

    2.测试fwrite
    <?php
    $userCount = 1000;
    $itemCount = 1000;
    $file = 'ratings.txt';
    file_exists($file) &&unlink($file);

    $fp = @fopen($file, 'ab');
    if (!$fp) die("Open $file failed");

    $timeStart = microtimeFloat();
    for ($i = 0; $i < $userCount; $i++) {
        $uid =random(32);
        for ($j = 0;$j < $itemCount; $j++) {
           $itemId = mt_rand(1, 300000);
           $rating = $j == 0 ? 1 : mt_rand(1, 100) / 100;
           $line = sprintf("%s,%d,%s ", $uid, $itemId, $rating);
           fwrite($fp, $line);
           $k++;
        }
    }
    if ($fp) @fclose($fp);
    $timeEnd = microtimeFloat();
    echo sprintf("Spend time: |%s| second(s) ", $timeEnd -$timeStart);
    ?>

    测试结果:
    写一百万行记录,10秒左右写完,对于PHP来说,速度算不错了。这是在我的个人电脑上面测试的,如果在生产机上测试,可能速度还要快一些。
    D:myphp esearch>php test2.php
    Spend time: |10.764221191406|second(s)

    用fwrite写入的数据是完整的
    999997,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,246982,0.03
    999998,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,240160,0.39
    999999,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,46296,0.61
    1000000,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,26211,0.14

    3.总结
    如果要往文件里面写入大量的数据,则推荐用fwrite,不要用file_put_contents。在高并发的请求中也建议用fwrite。
  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/gzmg/p/3225145.html
Copyright © 2011-2022 走看看