第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

memcached save 數(shù)據(jù)的一些疑問

memcached save 數(shù)據(jù)的一些疑問

眾所周知,memcached保存的時(shí)候可以這樣寫:$memcached->save("a",array("abc","bacd"),MEMCACHE_COMPRESSED,0);以及:$memcached->save("a",json_encode(array("abc","bacd")),MEMCACHE_COMPRESSED,0);但,問題就來了,經(jīng)過1W調(diào)數(shù)據(jù)測試,若$data=array();中包含中文漢字通過json_encode存入memcached后,明顯要比直接存入array的速度要慢很多很多??墒莔emcache的底層save的時(shí)候,如果傳遞的$value為array()那么采用serialize進(jìn)行序列化。可是,jsonencode和serialize的性能差異非常大,jsonencode明顯會(huì)要比serialize要快許多。求問,memcached最終傳遞什么值為好?array?還是string?
查看完整描述

2 回答

?
阿波羅的戰(zhàn)車

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊

json_encode明顯要比serialize快很多?RUSURE?
$str='但,問題就來了,經(jīng)過1W調(diào)數(shù)據(jù)測試,若$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.928114seconds
json_encode:in4.315019seconds
發(fā)現(xiàn)了上面的結(jié)論,下面可以直接被忽略了,僅供參考。
@iCode的說法可能是一部分的原因;更重要的是,無論是serialize還是json_encode,肯定都是O(n)的,只是serialize的常數(shù)可能比json_encode大;然而,由于serialize是在memcache內(nèi)部調(diào)用的,是直接了當(dāng)?shù)剞D(zhuǎn)換,存到sendbuf里,所以可以省掉相當(dāng)?shù)霓D(zhuǎn)換開銷:
//memcache_binary_protocol.c+416
status=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則不然:必須先分配一塊空間,存進(jìn)去,生成一個(gè)對(duì)應(yīng)的zval對(duì)象,扔回php,再由php交給memcache,然后:
//memcache_binary_protocol.c+416
status=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);
可以想象,在這樣一個(gè)過程中,使用json_encode的開銷顯著增加了。所以它比直接serialize更差是可以理解的。
至于到底該用哪個(gè),說真的,php本來性能就差得很,不用特別在意這個(gè)地方,它往往不太可能會(huì)是性能的瓶頸。如果真的覺得到了性能優(yōu)化要摳這里的時(shí)候(估計(jì)你更可能會(huì)選擇用其他語言重寫,例如python)(或者恭喜你,可以去找投資人了),方法很多,再不濟(jì)至少你可以直接修改memcache的源碼,把php_var_serialize改成json_encode。
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-07
?
DIEA

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊

$str='但,問題就來了,經(jīng)過1W調(diào)數(shù)據(jù)測試,若$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:"但,問題就來了,經(jīng)過1W調(diào)數(shù)據(jù)測試,若$data=array();中包含中文漢字通過json_encode存入memcached后,明顯要比直接存入array的速度要慢很多很多。";
*/
越長存起來就越慢的道理你是懂的吧..?
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-07
  • 2 回答
  • 0 關(guān)注
  • 302 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)