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 12 PHP
PHP array 的加法操作代码
Jul 24 PHP
php下目前为目最全的CURL中文说明
Aug 01 PHP
php 5.3.5安装memcache注意事项小结
Apr 12 PHP
php5.3以后的版本连接sqlserver2000的方法
Jul 28 PHP
php创建session的方法实例详解
Jan 27 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
Feb 12 PHP
php使用curl简单抓取远程url的方法
Mar 13 PHP
PHP中的session安全吗?
Jan 22 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 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 开发工具
2006/12/06 PHP
php数组去重的函数代码
2013/02/03 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
Javascript简单改变表单元素背景的方法
2015/07/15 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
Python操作json数据的一个简单例子
2014/04/17 Python
python实现批量监控网站
2016/09/09 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python实现淘宝购物系统
2019/10/25 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
英国电子专家:maplin
2019/09/04 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
医学专业个人求职自荐信格式
2013/09/23 职场文书
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
资料员岗位职责范本
2015/04/13 职场文书
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
微信小程序基础教程之echart的使用
2021/06/01 Javascript