众所周知,memcached保存的时候可以这样写:$memcached->save("a",array("abc","bacd"),MEMCACHE_COMPRESSED,0);以及:$memcached->save("a",json_encode(array("abc","bacd")),MEMCACHE_COMPRESSED,0);但,问题就来了,经过1W调数据测试,若$data=array();中包含中文汉字通过json_encode存入memcached后,明显要比直接存入array的速度要慢很多很多。可是memcache的底层save的时候,如果传递的$value为array()那么采用serialize进行序列化。可是,jsonencode和serialize的性能差异非常大,jsonencode明显会要比serialize要快许多。求问,memcached最终传递什么值为好?array?还是string?
2 回答
阿波罗的战车
TA贡献1862条经验 获得超6个赞
json_encode明显要比serialize快很多?RUSURE?$str='但,问题就来了,经过1W调数据测试,若$data=array();中包含中文汉字通过json_encode存入memcached后,明显要比直接存入array的速度要慢很多很多。';functionmicrotime_float(){list($usec,$sec)=explode("",microtime());return((float)$usec+(float)$sec);}$time_start=microtime_float();for($i=2000000;$i>0;$i--)serialize($str);printf("serialize:in%fseconds\n",microtime_float()-$time_start);$time_start=microtime_float();for($i=2000000;$i>0;$i--)json_encode($str);printf("json_encode:in%fseconds\n",microtime_float()-$time_start);Run:serialize:in0.928114secondsjson_encode:in4.315019seconds发现了上面的结论,下面可以直接被忽略了,仅供参考。@iCode的说法可能是一部分的原因;更重要的是,无论是serialize还是json_encode,肯定都是O(n)的,只是serialize的常数可能比json_encode大;然而,由于serialize是在memcache内部调用的,是直接了当地转换,存到sendbuf里,所以可以省掉相当的转换开销://memcache_binary_protocol.c+416status=mmc_pack_value(pool,&(request->sendbuf),value,&flagsTSRMLS_CC);=>default:php_var_serialize(&(buffer->value),&value_copy_ptr,&value_hashTSRMLS_CC);...;mmc_compress(pool,buffer,buffer->value.c+prev_len,buffer->value.len-prev_len,flags,1TSRMLS_CC);而json_encode则不然:必须先分配一块空间,存进去,生成一个对应的zval对象,扔回php,再由php交给memcache,然后://memcache_binary_protocol.c+416status=mmc_pack_value(pool,&(request->sendbuf),value,&flagsTSRMLS_CC);=>caseIS_STRING:*flags|=MMC_TYPE_STRING;mmc_compress(pool,buffer,Z_STRVAL_P(value),Z_STRLEN_P(value),flags,0TSRMLS_CC);可以想象,在这样一个过程中,使用json_encode的开销显著增加了。所以它比直接serialize更差是可以理解的。至于到底该用哪个,说真的,php本来性能就差得很,不用特别在意这个地方,它往往不太可能会是性能的瓶颈。如果真的觉得到了性能优化要抠这里的时候(估计你更可能会选择用其他语言重写,例如python)(或者恭喜你,可以去找投资人了),方法很多,再不济至少你可以直接修改memcache的源码,把php_var_serialize改成json_encode。
DIEA
TA贡献1820条经验 获得超2个赞
$str='但,问题就来了,经过1W调数据测试,若$data=array();中包含中文汉字通过json_encode存入memcached后,明显要比直接存入array的速度要慢很多很多。';$jstr=json_encode($str);$sstr=serialize($str);echostrlen($jstr),'|',$jstr,PHP_EOL,strlen($sstr),'|',$sstr;/*336|"\u4f46\uff0c\u95ee\u9898\u5c31\u6765\u4e86\uff0c\u7ecf\u8fc71W\u8c03\u6570\u636e\u6d4b\u8bd5\uff0c\u82e5$data=array();\u4e2d\u5305\u542b\u4e2d\u6587\u6c49\u5b57\u901a\u8fc7json_encode\u5b58\u5165memcached\u540e\uff0c\u660e\u663e\u8981\u6bd4\u76f4\u63a5\u5b58\u5165array\u7684\u901f\u5ea6\u8981\u6162\u5f88\u591a\u5f88\u591a\u3002"199|s:190:"但,问题就来了,经过1W调数据测试,若$data=array();中包含中文汉字通过json_encode存入memcached后,明显要比直接存入array的速度要慢很多很多。";*/越长存起来就越慢的道理你是懂的吧..?
添加回答
举报
0/150
提交
取消