php中读写文件与读写数据库的效率比较分享


Posted in PHP onOctober 19, 2013

这个问题也是最近才想到的,就是到底读文件更快还是读数据库更快,能快多少,天缘也搜索过,没见有网友就这个问题答复过,也可能是太简单的缘故,我们本文还是来实测一下,由于时间关系,VC还没装,天缘先用PHP测试了一下,下次有时间在C/C++上补充测试到本文来,因为PHP的底层解析应该也是基于C的,所以估计两者环境测试结果差不多,小问题大收获,现在就来看一下测试过程及结果。

测试程序如下:

说明1:由于读数据库语句调用简单的封包函数两次,所以把读文件也改成连续调用两次,数据库记录ID为1就在第一条,并且唯一索引。
说明2:测试两次一次是4K数据,一次是整形数据

set_time_limit(0);
function fnGet($filename)
{
$content = file_get_contents($filename);
return $content;
}
function fnGetContent($filename)
{
$content = fnGet($filename);
return $content;
}
$times=100000;
echo '数据库查询结果:<br/>';
//---------------------------------
$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
$res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
$row=$dbcon->mydb_fetch_row($res);
$content=$row[0];
}
echo 'fetch_row '.$times.' 次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';
//---------------------------------
$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
$res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
$row=$dbcon->mydb_fetch_array($res);
$content=$row['log_Content'];
}
echo 'fetch_array '.$times.' 次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';
//---------------------------------
$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
$res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
$row=$dbcon->mydb_fetch_object($res);
$content=$row->log_Content;
}
echo 'fetch_object '.$times.' 次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';
//---------------------------------
$dbcon->mydb_free_results();
$dbcon->mydb_disconnect();
fnWriteCache('test.txt',$content);
echo '直接读文件测试结果:<br/>';
//---------------------------------
$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
$content = fnGetContent('test.txt');
}
echo 'file_get_contents直接读'.$times.'次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';
//---------------------------------
$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
$fname = 'test.txt';
if(file_exists($fname))
{
$fp=fopen($fname,"r");//flock($fp,LOCK_EX);
$file_data=fread($fp, filesize($fname));//rewind($fp);
fclose($fp);
}
$content = fnGetContent('test.txt');
}
echo 'fopen直接读'.$times.'次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';

4K大小数据的查询结果:
fetch_row 100000 次时间:16.737720012665秒
fetch_array 100000 次时间:16.661195993423秒
fetch_object 100000 次时间:16.775065898895秒
直接读文件测试结果:
file_get_contents直接读100000次时间:5.4631857872009秒
fopen直接读100000次时间:11.463611125946秒
整形ID查询结果:
fetch_row 100000 次时间:12.812072038651秒
fetch_array 100000 次时间:12.667390108109秒
fetch_object 100000 次时间:12.988099098206秒
直接读文件测试结果:
file_get_contents直接读100000次时间:5.6616430282593秒
fopen直接读100000次时间:11.542816877365秒

测试结论:

1、直接读文件相比数据库查询效率更胜一筹,而且文中还没算上连接和断开的时间。
2、一次读取的内容越大,直接读文件的优势会越明显(读文件时间都是小幅增长,这跟文件存储的连续性和簇大小等有关系),这个结果恰恰跟天缘预料的相反,说明MYSQL对更大文件读取可能又附加了某些操作(两次时间增长了近30%),如果只是单纯的赋值转换应该是差异偏小才对。
3、写文件和INSERT几乎不用测试就可以推测出,数据库效率只会更差。
4、很小的配置文件如果不需要使用到数据库特性,更加适合放到独立文件里存取,无需单独创建数据表或记录,很大的文件比如图片、音乐等采用文件存储更为方便,只把路径或缩略图等索引信息放到数据库里更合理一些。
5、PHP上如果只是读文件,file_get_contents比fopen、fclose更有效率,不包括判断存在这个函数时间会少3秒左右。
6、fetch_row和fetch_object应该是从fetch_array转换而来的,我没看过PHP的源码,单从执行上就可以说明fetch_array效率更高,这跟网上的说法似乎相反。
实际上在做这个试验之前,从个人经验判断就有了大概的结果,测试完成后则有种豁然开朗的感觉。假定在程序效率和关键过程相当且不计入缓存等措施的条件下,读写任何类型的数据都没有直接操作文件来的快,不论MSYQL过程如何,最后都要到磁盘上去读这个“文件”(记录存储区等效),所以当然这一切的前提是只读内容,无关任何排序或查找操作。

PHP 相关文章推荐
php&amp;java(三)
Oct 09 PHP
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
初学CAKEPHP 基础教程
Nov 02 PHP
php文档更新介绍
Jul 22 PHP
浅析ThinkPHP中execute和query方法的区别
Jun 13 PHP
php中动态修改ini配置
Oct 14 PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
PHP经典面试题集锦
Mar 19 PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 PHP
Yii2框架中一些折磨人的坑
Dec 15 PHP
is_file和file_exists效率比较
Mar 14 PHP
PHP中include与require使用方法区别详解
Oct 19 #PHP
php文件上传的简单实例
Oct 19 #PHP
php上传文件,创建递归目录的实例代码
Oct 18 #PHP
php用户注册页面利用js进行表单验证具体实例
Oct 17 #PHP
10 个经典PHP函数
Oct 17 #PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 #PHP
php class类的用法详细总结
Oct 17 #PHP
You might like
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
javascript 面向对象编程基础 多态
2009/08/21 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python中条件判断语句的简单使用方法
2015/08/21 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
过滤器的用法
2013/10/08 面试题
毕业生求职的求职信
2013/12/05 职场文书
党员年度个人总结
2015/02/14 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书