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写入数据库类代码分享
Jul 26 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
Jun 19 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
Aug 21 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 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基于base64解码图片与加密图片还原实例
2014/11/03 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
Redis构建分布式锁
2017/03/28 PHP
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
python选择排序算法的实现代码
2013/11/21 Python
wxPython窗口的继承机制实例分析
2014/09/28 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
opencv实现简单人脸识别
2021/02/19 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
学生打架检讨书1000字
2014/01/16 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
大型会议接待方案
2014/03/01 职场文书
德育标兵事迹材料
2014/08/24 职场文书
小学中等生评语
2014/12/29 职场文书
员工工作表扬信
2015/05/05 职场文书
2015年推普周活动方案
2015/05/06 职场文书
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python