APC 与 Memcache 取数据性能对比
2016-11-18 11:36
417 查看
4000多条道具数据,序列化之后4M大小。
结果是:
Memcache平均取速度为:0.134032303095秒
Apc平均取速度为:0.346668326855秒
真心没想到啊。网上没看到apc是否序列化的说明。我想既然是个扩展,那么应该是设置一个指针指向这个变量,取的时候直接把这个地址转换成zval,就可以直接用了。结果看来不是这样的。
------------------------------
然后我只取1000条数据,发现情况有所不同:
Memcache平均取速度为:0.000312173367秒
Apc平均取速度为:0.000287636121秒
眼睛又被辣到了。数据少了3/4,性能提升 400 - 1000倍!
------------------------------
然后我只取2000条数据,情况是:
Memcache平均取速度为:0.000837951899秒
Apc平均取速度为:0.000848603249秒
多1000条数据,时间多了不少。
=======================================
总结起来,memcache除开socket链接时间,速度快于apc。
但主要的问题还是在于反序列化的时间。
附上测试代码:
下面是开动脑筋的时间了。改造下存储方法,把长数据分成多个存储,取出时取多次再合并。
结果:
500条存一个,平均时间:0.006096243858秒
1000条存一个,平均时间:0.004376041889
看来也不是越少越好。
结果是:
Memcache平均取速度为:0.134032303095秒
Apc平均取速度为:0.346668326855秒
真心没想到啊。网上没看到apc是否序列化的说明。我想既然是个扩展,那么应该是设置一个指针指向这个变量,取的时候直接把这个地址转换成zval,就可以直接用了。结果看来不是这样的。
------------------------------
然后我只取1000条数据,发现情况有所不同:
Memcache平均取速度为:0.000312173367秒
Apc平均取速度为:0.000287636121秒
眼睛又被辣到了。数据少了3/4,性能提升 400 - 1000倍!
------------------------------
然后我只取2000条数据,情况是:
Memcache平均取速度为:0.000837951899秒
Apc平均取速度为:0.000848603249秒
多1000条数据,时间多了不少。
=======================================
总结起来,memcache除开socket链接时间,速度快于apc。
但主要的问题还是在于反序列化的时间。
附上测试代码:
<?php function llog($s){ file_put_contents(ERR_LOG_FILE,chr(10).$s,FILE_APPEND); } if(!defined('ERR_LOG_FILE')){ function shutdown(){ if(defined(MY_LOG)) file_put_contents(MY_LOG,chr(10).'============== shutdown => '.$_SERVER['REQUEST_URI'].' ==============',FILE_APPEND); else llog('============== shutdown => '.$_SERVER['REQUEST_URI'].' =============='); if(defined('ERR_LOG_FILE')){ $_error=error_get_last(); if($_error && in_array($_error['type'],array(1,4,16,64,256,4096,E_ALL))){ $s = chr(10).'---------------------'.chr(10).date('Y/m/d H:i:s').' error:'.$_error['message'].chr(10); $s .= 'File:'.$_error['file'].chr(10); $s .= 'Line:'.$_error['line'].chr(10); file_put_contents(ERR_LOG_FILE, $s , FILE_APPEND); } } } register_shutdown_function("shutdown"); define('ERR_LOG_FILE', PHP_OS!='WINNT'?'/tmp/wx.txt':'c:/pk_php.txt'); if(defined('ERR_LOG_FILE')){ ini_set("display_errors",0);//不在页面显示错误信Ï? error_reporting(E_ALL ^ E_NOTICE);//记录错误日志的¼侗?? ini_set( "log_errors", "On" );//打开错误日志 ini_set( "error_log", ERR_LOG_FILE);//设置保存错误日志的地址 } } $conn = mysql_connect("localhost", "lein", "123456"); if (!$conn) { echo "Unable to connect to DB: " . mysql_error(); exit; } if (!mysql_select_db("pm03")) { echo "Unable to select mydbname: " . mysql_error(); exit; } function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $m = memcache_connect('127.0.0.1',11211); $t= isset($_GET['t'])?$_GET['t']:1; $key = 'propsr18'.$_GET['p']; if($t==2) $d = memcache_get($m,$key); //memcache_delete($key,0); if( ($t==1&&!apc_exists($key)) || ($t==2&&!$d) ){ $sql = "SELECT * FROM abc"; $result = mysql_query($sql); if (!$result) { echo "Could not successfully run query ($sql) from DB: " . mysql_error(); exit; } if (mysql_num_rows($result) == 0) { echo "No rows found, nothing to print so am exiting"; exit; } $rows = array(); $c = 2000; while ($row = mysql_fetch_assoc($result)&&$c--) { $rows[] = $row; } apc_add($key.'time',time()); if($t==1) apc_add($key, $rows); else{ echo count($rows).chr(10); memcache_set($m, $key, $rows,0,600); echo count(memcache_get($m, $key)); } } else{ echo 'Cache at:'.date('Y-m-d H:i:s',apc_fetch($key.'time')).'<br/>'; $s = microtime_float(); for($i=1;$i<101;$i++){ if($t==1) $d = apc_fetch($key); else $d = memcache_get($m, $key); if($i%10==0){ echo $i.' '; printf("%16.12f",(microtime_float()-$s)/$i); echo ', count='.count($d).'</br>'; } } printf("%16.12f",(microtime_float()-$s)/$i); echo '<br/>'; echo strlen(serialize($d))/1024; } ?>
下面是开动脑筋的时间了。改造下存储方法,把长数据分成多个存储,取出时取多次再合并。
define('_AMC_SIZE', 500); function Apc_add1($key, $v){ $c = count($v); $i = 0; $count = 0; while($i<$c){ $data = array_slice($v,$i,_AMC_SIZE); $i+=_AMC_SIZE; $k = '__SLD_'.$count.'_'.$key; apc_add($k, $data); $count++; } } function Apc_get1($key){ $count = 0; $arr = array(); while(1){ $k = '__SLD_'.$count.'_'.$key; $d = apc_fetch($k); $arr = array_merge($arr,$d); $count++;
if(count($d)<_AMC_SIZE) break;
}
return $arr;}
结果:
500条存一个,平均时间:0.006096243858秒
1000条存一个,平均时间:0.004376041889
看来也不是越少越好。
相关文章推荐
- php中Apc和memcache缓存数据性能对比
- php中Apc和memcache缓存数据性能对比
- C#读取Excel数据两种方式性能对比
- 遍历DataTable内存数据的三种方法性能对比 dataTable.Select 用过不?
- 关于若干数据库数据插入性能的对比
- 遍历DataTable内存数据的三种方法性能对比 dataTable.Select优先选择
- SQLServer中批量插入数据方式的性能对比
- NClay数据持化组件性能对比情况
- SQLServer中批量插入数据方式的性能对比
- 千万级别数据表,单列索引和多列索引性能对比
- SQLServer中批量插入数据方式的性能对比
- 遍历DataTable内存数据的三种方法性能对比 dataTable.Select 用过不?
- 遍历DataTable内存数据的三种方法性能对比
- SQLServer中批量插入数据方式的性能对比 (转)
- 千万级别数据表,单列索引和多列索引性能对比
- 遍历DataTable内存数据的三种方法性能对比 dataTable.Select 用过不?
- SQLServer中批量插入数据方式的性能对比
- 遍历DataTable内存数据的三种方法性能对比 dataTable.Select 用过不?
- mysql 序列化缓存到txt文件查找数据与直接查找数据 性能对比,13,601条数据文件缓存平均0.085秒后只需0.025秒 推荐 程序员导航网http://www.je666.com
- SQLServer中批量插入数据方式的性能对比