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一些公用函数的集合
Mar 27 PHP
PHP array 的加法操作代码
Jul 24 PHP
php数据库抽象层 PDO
May 07 PHP
提高PHP编程效率的方法
Nov 07 PHP
php 批量添加多行文本框textarea一行一个
Jun 03 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
PHP转盘抽奖接口实例
Feb 09 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
PHP基于回溯算法解决n皇后问题的方法示例
Nov 07 PHP
PHP实现简单日历类编写
Aug 28 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
python生成器的使用方法
2013/11/21 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
HTML5 客户端数据库简易使用:IndexedDB
2019/12/19 HTML / CSS
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
购买一个高级域名:BuyDomains
2018/03/11 全球购物
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
会计学专业求职信
2014/07/17 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
怎么写工作检讨书
2014/11/16 职场文书
英语教师求职信范文
2015/03/20 职场文书
迎新年主持词
2015/07/06 职场文书
golang 实现Location跳转方式
2021/05/02 Golang
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS