PHP中json_encode、json_decode與serialize、unserialize的性能測(cè)試分析
更新時(shí)間:2010年06月09日 10:46:27 作者:
今天偶然在想,如果用PHP寫(xiě)一個(gè)類(lèi)似BDB的基于文件的Key-Value小型數(shù)據(jù)庫(kù)用于存儲(chǔ)非結(jié)構(gòu)化的記錄型數(shù)據(jù),不知道效率會(huì)如何?
于是便聯(lián)想到PHP中的對(duì)象怎么樣序列化存儲(chǔ)性?xún)r(jià)比最高呢?接著想到了之前同事推薦的JSON編碼和解碼函數(shù)。
據(jù)他所說(shuō),json_encode和json_decode比內(nèi)置的serialize和unserialize函數(shù)要高效。
于是我決定動(dòng)手實(shí)驗(yàn),證實(shí)一下同事所說(shuō)的情況是否屬實(shí)。
實(shí)驗(yàn)分別在PHP 5.2.13和PHP 5.3.2環(huán)境下進(jìn)行。
用同一個(gè)變量,分別用以上方式進(jìn)行編碼或解碼10000次,并得出每個(gè)函數(shù)執(zhí)行10000次所需的時(shí)間。
以下是PHP 5.2.13環(huán)境其中一次測(cè)試結(jié)果:
json : 190
serialize : 257
json_encode : 0.08364200592041
json_decode : 0.18004894256592
serialize : 0.063642024993896
unserialize : 0.086990833282471
DONE.
以下是PHP 5.3.2環(huán)境其中一次測(cè)試結(jié)果:
json : 190
serialize : 257
json_encode : 0.062805891036987
json_decode : 0.14239192008972
serialize : 0.048481941223145
unserialize : 0.05927300453186
DONE.
這次實(shí)驗(yàn)得到的結(jié)論是:
json_encode和json_decode的效率并沒(méi)有比serialize和unserialize的效率高,在反序列化的時(shí)候性能相差兩倍左右,PHP 5.3執(zhí)行效率比PHP 5.2略有提升。
以下是我用來(lái)做測(cè)試的代碼:
<?php
$target = array (
'name' => '全能頭盔',
'quality' => 'Blue',
'ti_id' => 21302,
'is_bind' => 1,
'demand_conditions' =>
array (
'HeroLevel' => 1,
),
'quality_attr_sign' =>
array (
'HeroStrength' => 8,
'HeroAgility' => 8,
'HeroIntelligence' => 8,
),
);
$json = json_encode($target);
$seri = serialize($target);
echo "json :\t\t" . strlen($json) . "\r\n";
echo "serialize :\t" . strlen($seri) . "\r\n\r\n";
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
json_encode($target);
}
$etime = microtime(true);
echo "json_encode :\t" . ($etime - $stime) . "\r\n";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
json_decode($json);
}
$etime = microtime(true);
echo "json_decode :\t" . ($etime - $stime) . "\r\n\r\n";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
serialize($target);
}
$etime = microtime(true);
echo "serialize :\t" . ($etime - $stime) . "\r\n";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
unserialize($seri);
}
$etime = microtime(true);
echo "unserialize :\t" . ($etime - $stime) . "\r\n\r\n";
echo 'DONE.';
?>
據(jù)他所說(shuō),json_encode和json_decode比內(nèi)置的serialize和unserialize函數(shù)要高效。
于是我決定動(dòng)手實(shí)驗(yàn),證實(shí)一下同事所說(shuō)的情況是否屬實(shí)。
實(shí)驗(yàn)分別在PHP 5.2.13和PHP 5.3.2環(huán)境下進(jìn)行。
用同一個(gè)變量,分別用以上方式進(jìn)行編碼或解碼10000次,并得出每個(gè)函數(shù)執(zhí)行10000次所需的時(shí)間。
以下是PHP 5.2.13環(huán)境其中一次測(cè)試結(jié)果:
復(fù)制代碼 代碼如下:
json : 190
serialize : 257
json_encode : 0.08364200592041
json_decode : 0.18004894256592
serialize : 0.063642024993896
unserialize : 0.086990833282471
DONE.
以下是PHP 5.3.2環(huán)境其中一次測(cè)試結(jié)果:
復(fù)制代碼 代碼如下:
json : 190
serialize : 257
json_encode : 0.062805891036987
json_decode : 0.14239192008972
serialize : 0.048481941223145
unserialize : 0.05927300453186
DONE.
這次實(shí)驗(yàn)得到的結(jié)論是:
json_encode和json_decode的效率并沒(méi)有比serialize和unserialize的效率高,在反序列化的時(shí)候性能相差兩倍左右,PHP 5.3執(zhí)行效率比PHP 5.2略有提升。
以下是我用來(lái)做測(cè)試的代碼:
復(fù)制代碼 代碼如下:
<?php
$target = array (
'name' => '全能頭盔',
'quality' => 'Blue',
'ti_id' => 21302,
'is_bind' => 1,
'demand_conditions' =>
array (
'HeroLevel' => 1,
),
'quality_attr_sign' =>
array (
'HeroStrength' => 8,
'HeroAgility' => 8,
'HeroIntelligence' => 8,
),
);
$json = json_encode($target);
$seri = serialize($target);
echo "json :\t\t" . strlen($json) . "\r\n";
echo "serialize :\t" . strlen($seri) . "\r\n\r\n";
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
json_encode($target);
}
$etime = microtime(true);
echo "json_encode :\t" . ($etime - $stime) . "\r\n";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
json_decode($json);
}
$etime = microtime(true);
echo "json_decode :\t" . ($etime - $stime) . "\r\n\r\n";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
serialize($target);
}
$etime = microtime(true);
echo "serialize :\t" . ($etime - $stime) . "\r\n";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{
unserialize($seri);
}
$etime = microtime(true);
echo "unserialize :\t" . ($etime - $stime) . "\r\n\r\n";
echo 'DONE.';
?>
您可能感興趣的文章:
- 詳解php中serialize()和unserialize()函數(shù)
- php序列化函數(shù)serialize() 和 unserialize() 與原生函數(shù)對(duì)比
- php中magic_quotes_gpc對(duì)unserialize的影響分析
- php函數(shù)serialize()與unserialize()用法實(shí)例
- php中unserialize返回false的解決方法
- 淺談php函數(shù)serialize()與unserialize()的使用方法
- 淺談php serialize()與unserialize()的用法
- 非常好用的兩個(gè)PHP函數(shù) serialize()和unserialize()
- php serialize()與unserialize() 不完全研究
相關(guān)文章
php mysqli查詢(xún)語(yǔ)句返回值類(lèi)型實(shí)例分析
這篇文章主要介紹了php mysqli查詢(xún)語(yǔ)句返回值類(lèi)型,結(jié)合實(shí)例形式分析了php+mysqli常用的查詢(xún)、插入語(yǔ)句的使用與返回值類(lèi)型,需要的朋友可以參考下2016-06-06php實(shí)現(xiàn)MD5加密16位(不要默認(rèn)的32位)
今天做了個(gè)php鏈接mssql數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中的表中字段使用MD5十六加密的。但是php中的MD5默認(rèn)是32位,導(dǎo)致登錄程序沒(méi)辦法使用md5加密跟表中字段匹配,在網(wǎng)上一搜也有不少人有這方面的困惑,后來(lái)找到一個(gè)解決辦法,是正確的,就記錄下來(lái)2013-08-08SWFUpload與CI不能正確上傳識(shí)別文件MIME類(lèi)型解決方法分享
問(wèn)題:swfupload上傳任何文件的mime類(lèi)型均為application/octet-stream。2011-04-04php編程實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)頁(yè)版計(jì)算器功能示例
這篇文章主要介紹了php編程實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)頁(yè)版計(jì)算器功能,涉及php簡(jiǎn)單表單操作與數(shù)值運(yùn)算相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-04-04六個(gè)步驟,從零開(kāi)始教你搭建基于WordPress的個(gè)人博客
這篇文章主要介紹了六個(gè)步驟,從零開(kāi)始教你搭建基于WordPress的個(gè)人博客,步驟講解的很清楚,不知道如何搭建wordpress的同學(xué)可以跟著搭建下2021-01-01