喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

上一主题 下一主题
 21  1/3  1  2  3  > 
     
标题: serialize+unserialize+file_get_contents进行数组缓存 更快  
 
kinpoo
注册会员
Rank: 2
初级会员



UID 30794
精华 0
积分 101
帖子 108
金钱 101 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2004-8-30
状态 离线
serialize+unserialize+file_get_contents进行数组缓存 更快



<?php
/*
@kinpoo
结果表明:
    使用serialize,unserialize将数组以字符串保存 使用文件函数读取
    比直接将数组缓存(保存为普通文件) 要快好多!
*/
runTimer();
$arr = array();
/**
======================================
闪龙2500 512M内存 Windows ZendStudio(php5)
======================================
for() $arr[] = $i   : 0.30359721183777
serialize($arr)     : 0.04067587852478
unserialize($str)   : 0.017976045608521
saveArray($arr)     : 0.47954797744751
array2str($arr)     : 0.075201034545898
require array.php   : 0.058645963668823
uns get arr2str     : 0.026206016540527
---------------------------------------
for() $arr[] = $i   : 0.29530215263367
serialize($arr)     : 0.040746927261353
unserialize($str)   : 0.019726991653442
saveArray($arr)     : 0.47745704650879
array2str($arr)     : 0.081848859786987
require array.php   : 0.061783075332642
uns get arr2str     : 0.025933980941772
---------------------------------------
for() $arr[] = $i   : 0.3032820224762
serialize($arr)     : 0.04182505607605
unserialize($str)   : 0.018662929534912
saveArray($arr)     : 0.4787380695343
array2str($arr)     : 0.064285039901733
require array.php   : 0.059487104415894
uns get arr2str     : 0.025193929672241

=======================================
P4 3.0*2 2G内存 FreeBSD ZUES(php4)
=======================================
for() $arr[] = $i   : 0.00745916366577
serialize($arr)     : 0.00995993614197
unserialize($str)   : 0.00597906112671
saveArray($arr)     : 0.0302128791809
array2str($arr)     : 0.0132899284363
require array.php   : 0.0160081386566
uns get arr2str     : 0.00748491287231
---------------------------------------
for() $arr[] = $i   : 0.00716590881348
serialize($arr)     : 0.0100538730621
unserialize($str)   : 0.00590419769287
saveArray($arr)     : 0.022922039032
array2str($arr)     : 0.0129978656769
require array.php   : 0.0156490802765
uns get arr2str     : 0.00727105140686
---------------------------------------
for() $arr[] = $i   : 0.00741505622864
serialize($arr)     : 0.010134935379
unserialize($str)   : 0.0060088634491
saveArray($arr)     : 0.0238091945648
array2str($arr)     : 0.0134818553925
require array.php   : 0.016517162323
uns get arr2str     : 0.0071918964386
*/
/** 一维数组 10000元素 **/
//for ($i=0;$i<10000;$i++)
//{
//    $arr[] = $i;
//}


/*
======================================
闪龙2500 512M内存 Windows ZendStudio(php5)
======================================
for() $arr[] = $i   : 0.18432211875916
serialize($arr)     : 0.031507968902588
unserialize($str)   : 0.034507989883423
saveArray($arr)     : 0.63693904876709
array2str($arr)     : 0.028126001358032
require array.php   : 0.066259860992432
uns get arr2str     : 0.033874988555908
---------------------------------------
for() $arr[] = $i   : 0.18541598320007
serialize($arr)     : 0.030216932296753
unserialize($str)   : 0.03343391418457
saveArray($arr)     : 0.64722514152527
array2str($arr)     : 0.03127384185791
require array.php   : 0.050411224365234
uns get arr2str     : 0.029117822647095
---------------------------------------
for() $arr[] = $i   : 0.18497705459595
serialize($arr)     : 0.029504060745239
unserialize($str)   : 0.032404899597168
saveArray($arr)     : 0.64386487007141
array2str($arr)     : 0.021266222000122
require array.php   : 0.050238847732544
uns get arr2str     : 0.036464929580688

=======================================
P4 3.0*2 2G内存 FreeBSD ZUES(php4)
=======================================
for() $arr[] = $i   : 0.00499582290649
serialize($arr)     : 0.00840902328491
unserialize($str)   : 0.00594711303711
saveArray($arr)     : 0.075856924057
array2str($arr)     : 0.0107200145721
require array.php   : 0.0161650180817
uns get arr2str     : 0.00800800323486
---------------------------------------
for() $arr[] = $i   : 0.00484800338745
serialize($arr)     : 0.00845813751221
unserialize($str)   : 0.005854845047
saveArray($arr)     : 0.0720150470734
array2str($arr)     : 0.00950694084167
require array.php   : 0.0161731243134
uns get arr2str     : 0.00786995887756
---------------------------------------
for() $arr[] = $i   : 0.00545597076416
serialize($arr)     : 0.00866007804871
unserialize($str)   : 0.00611996650696
saveArray($arr)     : 0.0828499794006
array2str($arr)     : 0.0136148929596
require array.php   : 0.0294671058655
uns get arr2str     : 0.0131070613861
*/
/** 1000维数组 10000元素 **/
$ref = &$arr;
for (
$i=0;$i<1000;$i++)
{
    
$ref[0] = $i;
    
$ref[1] = $i;
    
$ref[2] = $i;
    
$ref[3] = $i;
    
$ref[4] = $i;
    
$ref[5] = $i;
    
$ref[6] = $i;
    
$ref[7] = $i;
    
$ref[8] = $i;
    
$ref[9] = array();
    
$ref = &$ref[9];
}

runTimer('for() $arr[] = $i   ');
$str serialize($arr);
runTimer('serialize($arr)     ');
$arr unserialize($str);
runTimer('unserialize($str)   ');
saveArray($arr1);
runTimer('saveArray($arr)     ');
array2str(&$arr);
runTimer('array2str($arr)     ');
require(
'test.array.php');
runTimer('require array.php   ');
$arr unserialize(file_get_contents('test.arr2str.php'));
runTimer('uns get arr2str     ');
function 
runTimer($str '')
//统计时间
    
static $st 0;
    
$mt explode(' 'microtime());
    
$ct $mt[0] + $mt[1];
    if (
$st)
        echo 
"n$str: "$ct $st;
    
$st $ct;
}

function 
saveArray(&$arr$isbase 0)
//保存数组的
    
$pre '';
    
$str 'array(';
    foreach (
$arr as $one)
    {
        if (
is_array($one))
        {
            
$str .= $pre.saveArray($one);
        } else {
            
$str .= $pre."'$one'";
        }
        
$pre ',';
    }
    
$str .= ')';
    if (
$isbase) {
        
$fp fopen('test.array.php''wb');
        
fwrite($fp"<?n$arr=$str;n?>");
        
fclose($fp);
    }else{
        return 
$str;
    }
}

function 
array2str(&$arr)
//保存数组的serialize字符串
    
$fp fopen('test.arr2str.php''wb');
    
fwrite($fpserialize($arr));
    
fclose($fp);
}
?>
[ 本帖最后由 kinpoo 于 2006-8-9 02:25 PM 编辑 ]




矛盾是发展的源泉。
2006-8-9 02:22 PM#1
查看资料  访问主页  发短消息  ICQ 状态  顶部
 
游戏人间
版主
Rank: 7Rank: 7Rank: 7
风云山庄大少爷


UID 62639
精华 2
积分 14352
帖子 7229
金钱 14212 喜悦币
威望 20
人脉 120
阅读权限 100
注册 2004-12-21
来自 广西人在北京
状态 离线
[推荐阅读] marquee标准化的再一步发问
是没是真踢,研究研究一下先。



 
群号:6025396/6025252/19520091(广西PHP交流/PHP高级编程/算法交流)、饿踢Blog

寧可在嘗試中失敗,也不在保守中成功!

不為失敗找理由,只為成功找方法!
 
2006-8-9 02:36 PM#2
查看资料  访问主页  Blog  发短消息  顶部
 
无喱头 (无喱头)
论坛元老
Rank: 8Rank: 8
扯蛋仙


UID 24846
精华 3
积分 5957
帖子 1146
金钱 5893 喜悦币
威望 30
人脉 34
阅读权限 90
注册 2003-11-26
状态 离线
[推荐阅读] 一次性读取1万条数据和10万条数据的差异
file_get_contents 这个函数并不是一直有效的。如果安全模式被打开,此函数有可能失效。

一般来说,进行此类方案,需要使用socket或者curl系列函数来完成。




扯吧,一年又一年。。。
2006-8-9 03:00 PM#3
查看资料  Blog  发短消息  顶部
 
fcicq
新手上路
Rank: 1
初级会员



UID 24467
精华 0
积分 21
帖子 587
金钱 20 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2003-11-8
来自 fcicq.net
状态 离线
[推荐阅读] 优酷网www.yoqoo.com 诚聘PHPER,高级运维,c++
有没有对explode/implode,(un)serialize的比较?




2006-8-9 03:01 PM#4
查看资料  访问主页  Blog  发短消息  顶部
 
kinpoo
注册会员
Rank: 2
初级会员



UID 30794
精华 0
积分 101
帖子 108
金钱 101 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2004-8-30
状态 离线
[推荐阅读] 关于在线编辑器,怎么样从数据库读取


QUOTE:
原帖由 无喱头 于 2006-8-9 03:00 PM 发表
file_get_contents 这个函数并不是一直有效的。如果安全模式被打开,此函数有可能失效。

一般来说,进行此类方案,需要使用socket或者curl系列函数来完成。
使用 fread 也一样快的~
file_get_content 的步骤 就是 fopen fread fclose




矛盾是发展的源泉。
2006-8-9 03:29 PM#5
查看资料  访问主页  发短消息  ICQ 状态  顶部
 
kinpoo
注册会员
Rank: 2
初级会员



UID 30794
精华 0
积分 101
帖子 108
金钱 101 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2004-8-30
状态 离线
[推荐阅读] 求助:一个XAJAX 的奇怪问题


QUOTE:
原帖由 fcicq 于 2006-8-9 03:01 PM 发表
有没有对explode/implode,(un)serialize的比较?
explode/implode 对复杂的文本来说是一个问题~(分隔符可能会混淆了~)
unserialize/serialize 不存在此问题




矛盾是发展的源泉。
2006-8-9 03:32 PM#6
查看资料  访问主页  发短消息  ICQ 状态  顶部
 
fcicq
新手上路
Rank: 1
初级会员



UID 24467
精华 0
积分 21
帖子 587
金钱 20 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2003-11-8
来自 fcicq.net
状态 离线
[推荐阅读] 换公司,找广东,广西 的公司
(如果事先清楚呢?)就比如你这个循环的例子.




2006-8-9 06:41 PM#7
查看资料  访问主页  Blog  发短消息  顶部
 
kinpoo
注册会员
Rank: 2
初级会员



UID 30794
精华 0
积分 101
帖子 108
金钱 101 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2004-8-30
状态 离线
[推荐阅读] 分享,运用验证码的具体过程
回复 #7 fcicq 的帖子

事先清楚的话可以 我的例子只是为了方便测试 呵呵~
但如果用来实际应用的话 使用分隔符是不安全的




矛盾是发展的源泉。
2006-8-9 07:02 PM#8
查看资料  访问主页  发短消息  ICQ 状态  顶部
 
fcicq
新手上路
Rank: 1
初级会员



UID 24467
精华 0
积分 21
帖子 587
金钱 20 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2003-11-8
来自 fcicq.net
状态 离线
[推荐阅读] 用smarty如何处理FRAMESET框架?
测试:单维数组,php 5.1.4 gentoo linux 2.6.17 athlon 2500+,512M

for() $arr[] = $i   : 0.000921964645386
serialize($arr)     : 0.00114417076111
unserialize($str)   : 0.000725984573364
implode  : 0.0011830329895
explode  : 0.000683784484863

居然不相上下....气愤中.

代码:
<?php
runTimer();
$arr = array();
for ($i=0;$i<1000;$i++)
{
    $arr[$i] = $i;
}

runTimer('for() $arr[] = $i   ');
$str = serialize($arr);
runTimer('serialize($arr)     ');
$arr = unserialize($str);
runTimer('unserialize($str)   ');
$str=implode('|',$arr);
runTimer('implode  ');
$arr=explode('|',$str);
runTimer('explode  ');
echo "\r\n all is over \r\n";
function runTimer($str = '')
{ //统计时间
    static $st = 0;
    $mt = explode(' ', microtime());
    $ct = $mt[0] + $mt[1];
    if ($st)
        echo "\r\n$str: ", $ct - $st;
    $st = $ct;
}
?>





2006-8-9 08:10 PM#9
查看资料  访问主页  Blog  发短消息  顶部
 
fcicq
新手上路
Rank: 1
初级会员



UID 24467
精华 0
积分 21
帖子 587
金钱 20 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2003-11-8
来自 fcicq.net
状态 离线
[推荐阅读] 求打印条形码Code128标准的PHP代码??
100000:
for() $arr[] = $i   : 0.137245893478
serialize($arr)     : 0.208794116974
unserialize($str)   : 0.150620937347
implode  : 0.263659000397
explode  : 0.167237997055

1000000:
for() $arr[] = $i   : 1.02202010155 - 这行没用
serialize($arr)     : 1.79571890831
unserialize($str)   : 10.540897131
implode  : 2.3381459713
explode  : 1.27216887474

呵呵,看出啥了没?反序列化有点慢.





2006-8-9 08:14 PM#10
查看资料  访问主页  Blog  发短消息  顶部
 21  1/3  1  2  3  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.035218 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP