最近需要對大數組做存儲,需要在serialize序列化和json之間做了選擇。因此需要做了性能測試。
在php5.2之前對數組存儲的時候,大都使用serialize系列化。php5.2之后,開始內置了 JSON 的支持。
在網上看到有些資料說:json_encode和json_decode比內置的serialize和unserialize函數要高效。耳聞不如眼見,眼見不一定為實。那就用實際數據測試吧…..
我們先理解概念:
一、 序列化
序列化是將對象狀態轉換為可保持或可傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為對象。這兩個過程結合起來,可以輕松地存儲和傳輸數據。
將對象的狀態信息轉換為可以存儲或傳輸的窗體的過程。 在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。
通常,對象實例的所有字段都會被序列化,這意味著數據會被表示為實例的序列化數據。這樣,能夠解釋該格式的代碼有可能能夠確定這些數據的值,而不依賴于該成員的可訪問性。類似地,反序列化從序列化的表示形式中提取數據,并直接設置對象狀態,這也與可訪問性規則無關。 對于任何可能包含重要的安全性數據的對象,如果可能,應該使該對象不可序列化。如果它必須為可序列化的,請嘗試生成特定字段來保存不可序列化的重要數據。如果無法實現這一點,則應注意該數據會被公開給任何擁有序列化權限的代碼,并確保不讓任何惡意代碼獲得該權限。
二、 JSON
JSON,JavaScript Object Notation,一種更輕、更友好的用于接口(AJAX、REST等)數據交換的格式。 JSON是結構化數據串行化的文本格式,作為XML的一種替代品,用于表示客戶端與服務器間數據交換有效負載的格式。它是從ECMAScript語言標準衍生而來的。JSON的設計目標是使它成為小的、輕便的、文本的,而且是JavaScript的一個子集。JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數據交換語言。易于人閱讀和編寫,同時也易于機器解析和生成。
JSON建構有兩種結構:
1. “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),記錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。
2.值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
測試:
三、 實際測試
在PHP 5.3下執行:我們先使用小的數據做測試:
<?php $target = array ( 'battle_id'=> 257 ,'user_id'=> 41248 ,'user_id2'=> 23989 ,'player'=> 41248 ,'formation'=> Array ( '41248'=> 1 ,'23989'=> 2 ) ,'result'=> 1 ,'battle_type'=> 1 ,'speed'=> Array ( '41248'=> 0 ,'23989'=> 0 ) ); $json = json_encode($target); $seri = serialize($target); echo "json :" , strlen($json) ,'<br/>'; echo "serialize :", strlen($seri) ,'<br/>'; $stime = microtime(true); for ($i = 0; $i < 10000; $i ++) { json_encode($target); } $etime = microtime(true); echo "json_encode :", ($etime - $stime) ,'<br/>'; //---------------------------------- $stime = microtime(true); for ($i = 0; $i < 10000; $i ++) { json_decode($json,true); } $etime = microtime(true); echo "json_decode :", ($etime - $stime),'<br/>'; //---------------------------------- $stime = microtime(true); for ($i = 0; $i < 10000; $i ++) { serialize($target); } $etime = microtime(true); echo "serialize :", ($etime - $stime) ,'<br/>'; //---------------------------------- $stime = microtime(true); for ($i = 0; $i < 10000; $i ++) { unserialize($seri); } $etime = microtime(true); echo "unserialize :", ($etime - $stime),'<br/>'; ?>
測試結果:
json :156
serialize :222
json_encode :0.1087498664856
json_decode :0.12652111053467
serialize :0.041656017303467
unserialize :0.040987968444824
測試結果看出json效率稍微比serialize差點,在php5.2可能會更差。應該是在php5.3之后,json擴展做了優化。
然后使用大數組做測試(代碼放到最后,因為代碼的數組比較長):
測試結果:
json :5350
serialize :8590
json_encode :0.90479207038879
json_decode :1.753741979599
serialize :1.3566699028015
unserialize :1.3003630638123
我們可以看出,serialize比json差了快一個數量級。
總結:
1) 空間的比較
serialize在編碼后大概是json的1.5倍。
原因:
-
serialize后字符串包含了子串的長度,這可能是速度方面的優化,但是測試結果不盡人意。
-
serialize有更加詳細的類型區分,而json只有四種類型,并且是以簡單的符號表示。
-
2)速度的比較
-
在較小數據的情況下, serialize比json快數量級。
在大數據量的情況下,json比serialize稍微差一點
3)處理對象
json無法處理對象方法等數據。4)使用范圍
-
在前后端交互一般都使用JSON,另外,目前JSON只支持UTF-8編碼的數據。
序列化使用serialize,特別是對象的存儲。這是其存在的意義。
與對象無關的數據存儲可以使用json,如包含大量數字的數組等。
-
<?php $target = array ( 'battle_id'=> 257 ,'user_id'=> 41248 ,'user_id2'=> 23989 ,'player'=> 41248 ,'formation'=> Array ('41248'=> 1 ,'23989'=> 2) ,'result'=> 1 ,'battle_type'=> 1 ,'speed'=> Array( '41248'=> 0,'23989'=> 0 ) ,'attacker'=> Array( '1'=> Array ( 'user_id'=> 41248 ,'soldier_id'=> 28 ,'prototype_id'=> 4 ,'bid'=> 1 ,'level'=> 1 ,'rare'=> 1 ,'skill_id'=> 1 ,'totalhp'=> 3997 ,'hp'=> 3997 ,'attack_general'=> 346 ,'attack_skill'=> 596 ,'attack_explode'=> 458 ,'attack_type'=> 1 ,'defense'=> 0 ,'anger'=> 50 ,'dodge'=> 2 ,'crit'=> 2 ,'block'=> 2 ,'block_effect'=> 0.5 ,'crit_effect'=> 2 ,'foramtion_effect'=> 0) ,'4'=> Array ( 'user_id'=> 41248 ,'soldier_id'=> 29 ,'prototype_id'=> 2 ,'bid'=> 1 ,'level'=> 1 ,'rare'=> 1 ,'skill_id'=> 1 ,'totalhp'=> 3555 ,'hp'=> 3555 ,'attack_general'=> 396 ,'attack_skill'=> 581 ,'attack_explode'=> 418 ,'attack_type'=> 1 ,'defense'=> 0 ,'anger'=> 50 ,'dodge'=> 2 ,'crit'=> 2 ,'block'=> 0 ,'block_effect'=> 0.5 ,'crit_effect'=> 2 ,'foramtion_effect'=> 0 ) ,'5'=> Array ( 'user_id'=> 41248 ,'soldier_id'=> 30 ,'prototype_id'=> 6 ,'bid'=> 1 ,'level'=> 1 ,'rare'=> 1 ,'skill_id'=> 1 ,'totalhp'=> 3043 ,'hp'=> 3043 ,'attack_general'=> 351 ,'attack_skill'=> 540 ,'attack_explode'=> 474 ,'attack_type'=> 1 ,'defense'=> 0 ,'anger'=> 50 ,'dodge'=> 2 ,'crit'=> 2 ,'block'=> 0 ,'block_effect'=> 0.5 ,'crit_effect'=> 2 ,'foramtion_effect'=> 0) ,'7'=> Array ( 'user_id'=> 41248 ,'soldier_id'=> 37 ,'prototype_id'=> 2 ,'bid'=> 1 ,'level'=> 1 ,'rare'=> 1 ,'skill_id'=> 1 ,'totalhp'=> 3491 ,'hp'=> 3491 ,'attack_general'=> 393 ,'attack_skill'=> 532 ,'attack_explode'=> 456 ,'attack_type'=> 1 ,'defense'=> 0 ,'anger'=> 50 ,'dodge'=> 2 ,'crit'=> 2 ,'block'=> 0 ,'block_effect'=> 0.5 ,'crit_effect'=> 2 ,'foramtion_effect'=> 0 )) ,'defender'=> Array( '2'=> Array( 'user_id'=> 23989 ,'soldier_id'=> 24 ,'prototype_id'=> 1 ,'bid'=> 1 ,'level'=> 1 ,'rare'=> 1 ,'skill_id'=> 1 ,'totalhp'=> 3230 ,'hp'=> 3230 ,'attack_general'=> 390 ,'attack_skill'=> 567 ,'attack_explode'=> 442 ,'attack_type'=> 1 ,'defense'=> 0 ,'anger'=> 50 ,'dodge'=> 2 ,'crit'=> 2 ,'block'=> 0 ,'block_effect'=> 0.5 ,'crit_effect'=> 2 ,'foramtion_effect'=> 0) ,'5'=> Array( 'user_id'=> 23989 ,'soldier_id'=> 25 ,'prototype_id'=> 2 ,'bid'=> 1 ,'level'=> 1 ,'rare'=> 1 ,'skill_id'=> 1 ,'totalhp'=> 3400 ,'hp'=> 3400 ,'attack_general'=> 379 ,'attack_skill'=> 536 ,'attack_explode'=> 405 ,'attack_type'=> 1 ,'defense'=> 0 ,'anger'=> 50 ,'dodge'=> 2 ,'crit'=> 2 ,'block'=> 0 ,'block_effect'=> 0.5 ,'crit_effect'=> 2 ,'foramtion_effect'=> 0 ) ,'7'=> Array( 'user_id'=> 23989 ,'soldier_id'=> 26 ,'prototype_id'=> 6 ,'bid'=> 1 ,'level'=> 1 ,'rare'=> 1 ,'skill_id'=> 1 ,'totalhp'=> 3669 ,'hp'=> 3669 ,'attack_general'=> 362 ,'attack_skill'=> 549 ,'attack_explode'=> 426 ,'attack_type'=> 1 ,'defense'=> 0 ,'anger'=> 50 ,'dodge'=> 2 ,'crit'=> 2 ,'block'=> 0 ,'block_effect'=> 0.5 ,'crit_effect'=> 2 ,'foramtion_effect'=> 0 ) ,'9'=> Array( 'user_id'=> 23989 ,'soldier_id'=> 27 ,'prototype_id'=> 1 ,'bid'=> 1 ,'level'=> 1 ,'rare'=> 1 ,'skill_id'=> 1 ,'totalhp'=> 3618 ,'hp'=> 3618 ,'attack_general'=> 326 ,'attack_skill'=> 510 ,'attack_explode'=> 419 ,'attack_type'=> 1 ,'defense'=> 0 ,'anger'=> 50 ,'dodge'=> 2 ,'crit'=> 2 ,'block'=> 0 ,'block_effect'=> 0.5 ,'crit_effect'=> 2 ,'foramtion_effect'=> 0) ) ,'battle_process'=> Array( '0'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'1'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'2'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'3'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'4'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'5'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'6'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'7'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'8'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'9'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'10'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'11'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'12'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'13'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'14'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'15'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'16'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'17'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'18'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'19'=> Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ,'20'=>Array( 'user_id'=> 41248 ,'asid'=> 28 ,'bsid'=> Array( '0'=> 26 ) ,'harm'=> Array('0'=> 1650) ,'dhp'=> Array('0'=> 2019 ) ,'attacker_anger'=> 66 ,'defender_anger'=> Array('0'=> 94 ) ,'skill'=> 0 ,'state'=> 0 ) ) ); $json = json_encode($target); $seri = serialize($target); echo "json :" , strlen($json) ,'<br/>'; echo "serialize :", strlen($seri) ,'<br/>'; $stime = microtime(true); for ($i = 0; $i < 10000; $i ++) { json_encode($target); } $etime = microtime(true); echo "json_encode :", ($etime - $stime) ,'<br/>'; //---------------------------------- $stime = microtime(true); for ($i = 0; $i < 10000; $i ++) { json_decode($json,true); } $etime = microtime(true); echo "json_decode :", ($etime - $stime),'<br/>'; //---------------------------------- $stime = microtime(true); for ($i = 0; $i < 10000; $i ++) { serialize($target); } $etime = microtime(true); echo "serialize :", ($etime - $stime) ,'<br/>'; //---------------------------------- $stime = microtime(true); for ($i = 0; $i < 10000; $i ++) { unserialize($seri); } $etime = microtime(true); echo "unserialize :", ($etime - $stime),'<br/>'; ?>
轉自:http://blog.csdn.net/hguisu/article/details/7651730
原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2808