php中json是實時交換數據的一個常用的數據傳輸模式了,而serialize是把字符轉換成一個序列化字符串了,那么它們兩的性能那個會更好一些呢?對此小編整理了一些json和serialize 性能比較測試例子供各位學習參考.
測試1
1,操作元素較少,單個元素比較大,英文,3個元素操作1000次,代碼如下:
- $data = array('hello','word');
- $d = "helloword";
- $d = str_repeat($d, 10000);
- //for($i = 0;$i $data[] = $d;
- //}
- //var_dump($data);
- $jsonen_sarttime = getmicrotime();
- for($i=0;$i $json = json_encode($data);
- }
- echo "json長度:".strlen($json)."
- n";
- $jsonen_endtime = getmicrotime();
- echo "jsonencode耗時:".($jsonen_endtime - $jsonen_sarttime)."
- n";
- $jsonde_starttime = getmicrotime();
- for($i=0;$i $unjson = json_decode($json,true);
- }
- $jsonde_endtime = getmicrotime();
- echo "jsondecode耗時:".($jsonde_endtime - $jsonde_starttime)."
- n";
- $seri1_starttime = getmicrotime();
- for($i=0;$i $serialize = serialize($data);
- }
- echo "serialize長度:".strlen($serialize)."
- n";
- $seri1_endtime = getmicrotime();
- echo "serialize序列化耗時:".($seri1_endtime - $seri1_starttime)."
- n";
- $seri2_starttime = getmicrotime();
- for($i=0;$i $unserialize = unserialize($serialize);
- }
- $seri2_endtime = getmicrotime();
- echo "serialize反序列化耗時:".($seri2_endtime - $seri2_starttime)."
- n";
- /**
- *獲取時間記
- * @return
- */
- function getmicrotime(){
- list($usec, $sec) = explode(" ",microtime());
- return ((float)$usec + (float)$sec);
- }
- //output:
- json長度:90019
- jsonencode耗時:1.0974299907684
- jsondecode耗時:1.6237480640411
- serialize長度:90052
- serialize序列化耗時:0.025779962539673
- serialize反序列化耗時:0.029321193695068
可以看到json在做英文處理的時候,數組元素較少,體積要小于序列化的數據.處理效率低于序列化,將data 更改為如下代碼:
- $data = array('hello','word');
- $d = "你好";
- $d = str_repeat($d, 10000);
- //for($i = 0;$i $data[] = $d;
- //output:
- json長度:120019
- jsonencode耗時:0.83260488510132
- jsondecode耗時:2.2054090499878
- serialize長度:60052
- serialize序列化耗時:0.01835298538208
- serialize反序列化耗時:0.01848292350769
可以看到 json在做文字處理的時候,體積較大,處理效率也略低于序列化.
3.將數據更改為如下代碼:
- $data = array('hello','word');
- $d = "你好";
- for($i = 0;$i $data[] = $d;
- }
- //output:
- json長度:150016
- jsonencode耗時:2.1428198814392
- jsondecode耗時:6.5845320224762
- serialize長度:198939
- serialize序列化耗時:2.8011980056763
- serialize反序列化耗時:4.6967668533325
可以看到json體積略小于serialize.
4.將data修改為如下代碼:
- $data = array('hello','word');
- $d = "hello";
- for($i = 0;$i $data[] = $d;
- }
- //output:
- json長度:80016
- jsonencode耗時:1.6437809467316
- jsondecode耗時:4.5136170387268
- serialize長度:188939
- serialize序列化耗時:2.909558057785
- serialize反序列化耗時:4.4678349494934
測試2
以一個包含1000000個元素的數組做為原始數據,分別以json,serialize,igbinary進行序列化和反向操作,代碼如下:
- <?php
- ini_set('memory_limit', '512m');
- $array = array_fill(0, 1000000, rand(1, 9999));
- $start = microtime(true);
- $export = json_encode($array);
- $end = microtime(true);
- $duration = $end - $start;
- print('JSON Encode: ' . $duration . PHP_EOL);
- $start = microtime(true);
- $import = json_decode($export);
- $end = microtime(true);
- $duration = $end - $start;
- print('JSON Decode: ' . $duration . PHP_EOL);
- $start = microtime(true);
- $export = serialize($array);
- $end = microtime(true);
- $duration = $end - $start;
- print('Serialize: ' . $duration . PHP_EOL);
- $start = microtime(true);
- $import = unserialize($export);
- $end = microtime(true);
- $duration = $end - $start;
- print('Serialize: ' . $duration . PHP_EOL);
- $start = microtime(true);
- $export = igbinary_serialize($array);
- $end = microtime(true);
- $duration = $end - $start;
- print('Igbinary Serialize: ' . $duration . PHP_EOL);
- $start = microtime(true);
- $import = igbinary_unserialize($export);
- $end = microtime(true); //開源軟件:Vevb.com
- $duration = $end - $start;
- print('Igbinary Serialize: ' . $duration . PHP_EOL);
- ?>
- //測試結果
- JSON Encode: 0.084825992584229
- JSON Decode: 0.34976410865784
- Serialize: 0.38241410255432
- Serialize: 7.7904229164124
- Igbinary Serialize: 0.046916007995605
- Igbinary Serialize: 0.23396801948547
從測試結果來看,速度方面優先級排列為 igbinary > json > serialize。同時我們也可以看到,php原生的serialize在對大對象進行反向操作時,速度真是掉隊一大截了.
占用字節數對比
json:5000001
serialize:15888902
igbinary:7868681
在沒有中文字符的情況下,json勝出,igbinary次之,serialize又被甩了幾條街.
結論:
如果只是英文和數字,元素比較平均,則推薦json,體積和效率均優于序列化.
如果只是英文和數字,個別元素較大,則推薦serialize效率優于序列化.
如果中文,元素較少,推薦序列化,體積和效率均優于json.
如果中文,元素比較平均,推薦json.
如果是緩存業務,效率越高越好,如果是緩存數據,體積越小越好,也要看具體的場景.
新聞熱點
疑難解答