記json與serialize性能測試

最近在觀看swoole官方的課程時,其中有一小段專門說到了json_decode這個函數的效率問題,其慢的原因是在進行轉化時需要遍歷文中每一個字符去尋找EOF(關於EOF阮一峯大神這篇文章解釋得很詳細),而只有在確認整個字符串的格式和長度後,json格式纔可以被decode,也就是說假設整個字符串的長度爲N,那程序就必須進行N+1次的遍歷,那如果對於一些高併發的場景時,是否有更好的解決辦法呢?

而關於序列化還有另外一個常用的函數就是serialize,serialize在序列化後會將數值的類型和長度都一一記錄在序列化後的字符串中,如果依照這樣,serialize在進行反序列化時應該可以依照之前生成的字符直接去進行格式化,而無需再進行全文的遍歷尋找EOF,那是否在長字符串的情況下unserialize會比json_decode效率更高呢?

於是做了如下的實驗,分別用了三種類型的數組數據作爲測試,別爲中文,英文,以及數字,進行一次序列化和反序列化爲一個循環進行測試,其中基數爲循環的次數:

$array = [
    "I'm a gooPHP 是免費的,並且使用非常廣泛。同時,對於像微軟 ASP 這樣的競爭者來說,PHP 無疑是另一種高效率的選項。PHP 極其適合網站開發,其代碼可以直接嵌入 HTML 代碼.",
    "I'm a good boy.",
    "a" => "PHP 是免費的,並且使用非常廣泛。同時,對於像微軟 ASP 這樣的競爭者來說,PHP 無疑是另一種高效率的選項。PHP 極其適合網站開發,其代碼可以直接嵌入 HTML 代碼",
    2 =>"PHP 是免費的,並且使用非常廣泛。同時,對於像微軟 ASP 這樣的競爭者來說,PHP 無疑是另一種高效率的選項。PHP 極其適合網站開發,其代碼可以直接嵌入 HTML 代碼",
    'PHP 是免費的,並且使用非常廣泛。同時,對於像微軟 ASP 這樣的競爭者來說,PHP 無疑是另一種高效率的選項。PHP 極其適合網站開發,其代碼可以直接嵌入 HTML 代碼',
    "I'm a good boy.",
    "I'm a good boy.",
    "I'm a good boy.",
    "I'm a good boy.",
    "I'm a good",
    "asdfnsadofhasd"];
$array = [
    "I'm a boy",
    "I'm a boy",
    "I'm a boy",
    "I'm a boy",
    "I'm a boy",
    "I'm a boy",
    "I'm a boy",
    "I'm a boy",
    "I'm a boy",
    "I'm a boy",
];
$array = [
    0 => 9115,
    1 => 9115,
    2 => 9115,
    3 => 9115,
    4 => 9115,
    5 => 9115,
    6 => 9115,
    7 => 9115,
    8 => 9115,
    9 => 9115,
];

得出的測試結果如下
TIM圖片20191021163119.png

可以看到在英文和數字的序列化中,json的序列化效率是serialize的2-3倍,而在中文數組的測試中,serialize的效率爲json的8-10倍,也印證了前面的猜測:json在序列化和反序列數據時,字符串長度越長,cpu需要去執行尋找EOF的次數便越多,而serialize因爲在序列化的時候便記錄了字符串的長度,所以在反序列化的時候會比json花更少的時間

而且serialize在序列化時,因爲記錄了對應的子串的長度和類型,所以在相同的數據下,serialize會比json更佔用空間,也算是用空間換時間的一種辦法。

看到這裏大家應該明白這兩種序列化的適用場景:
如果是短內容的場景下,使用json作序列化是比較好的方法,不僅效率高且更字符串體積更小
如果是在長字符串的場景下,可以考慮用serialize,程序的執行效率會比json高不少!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章