最近看到memcached擴展支持額外的序列化方式 —igbinary,這是一個未收錄到pecl的php擴展,它提供的兩個主要方法:
igbinary_serialize
igbinary_unserialize
據稱可以用它來代替php自帶的序列化函數serialize,性能更好,而且佔用的字節數也更少。下面我就 igbinary ,serialize ,json_encode三者的性能做了一個簡單的測試。
測試
以一個包含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); $duration = $end - $start; print('Igbinary Serialize: ' . $duration . PHP_EOL); ?>
測試結果
JSON Encode: 0.076992034912109 JSON Decode: 0.47485995292664 Serialize: 0.42043685913086 Serialize: 0.27616095542908 Igbinary Serialize: 0.049700975418091 Igbinary Serialize: 0.22004795074463
從測試結果來看,速度方面優先級排列爲 igbinary > json > serialize。同時我們也可以看到,php原生的serialize在對大對象進行反向操作時,速度真是掉隊一大截了。
佔用字節數對比
json: 5000001
serialize: 15888902
igbinary: 7868681