PHP中fwrite与file_put_contents性能测试代码


Posted in PHP onAugust 02, 2013

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\n", $uid, $itemId, $rating);
       file_put_contents($file, $line, FILE_APPEND);
    }
}
$timeEnd = microtimeFloat();
echo sprintf("Spend time: |%s| second(s)\n", $timeEnd -$timeStart);
?>

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

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

Warning: file_put_contents(ratings.txt): failed to open stream:Permission denie
d in D:\myphp\research\test2.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\n", $uid, $itemId, $rating);
       fwrite($fp, $line);
       $k++;
    }
}
if ($fp) @fclose($fp);
$timeEnd = microtimeFloat();
echo sprintf("Spend time: |%s| second(s)\n", $timeEnd -$timeStart);
?>

测试结果:
写一百万行记录,10秒左右写完,对于PHP来说,速度算不错了。这是在我的个人电脑上面测试的,如果在生产机上测试,可能速度还要快一些。
D:\myphp\research>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。

PHP 相关文章推荐
php学习 函数 课件
Jun 15 PHP
PHPMyAdmin 快速配置方法
May 11 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
Jan 27 PHP
浅析get与post的一些特殊情况
Jul 28 PHP
php实现文件下载代码分享
Aug 19 PHP
php计算数组相同值出现次数的代码(array_count_values)
Jan 20 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
浅谈PHP中的那些魔术常量
Dec 02 PHP
PHP-Fcgi下PHP的执行时间设置方法
Aug 02 #PHP
基于php中使用excel的简单介绍
Aug 02 #PHP
PHP自动识别字符集并完成转码详解
Aug 02 #PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 #PHP
php实现查询百度google收录情况(示例代码)
Aug 02 #PHP
浅析PHP Socket技术
Aug 02 #PHP
php中如何防止表单的重复提交
Aug 02 #PHP
You might like
PHP date函数参数详解
2006/11/27 PHP
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
php+mysql 实现身份验证代码
2010/03/24 PHP
Yii清理缓存的方法
2016/01/06 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
ajax java 实现自动完成功能
2012/12/19 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
跟老齐学Python之折腾一下目录
2014/10/24 Python
Python中的列表知识点汇总
2015/04/14 Python
Python中splitlines()方法的使用简介
2015/05/20 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
Django 外键的使用方法详解
2019/07/19 Python
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
质检员的岗位职责
2013/11/15 职场文书
24岁生日感言
2014/01/13 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
借名购房协议书范本
2014/10/06 职场文书
员工自我评价范文
2015/03/11 职场文书
python中pandas对多列进行分组统计的实现
2021/06/18 Python