記json與serialize性能測試

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

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

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

$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.pngswoole

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

不過也由於serialize記錄了對應的子串的長度和類型,因此在相同的數據下,serialize會比json更佔用空間,也算是用空間換時間的一種辦法。ide

看到這裏你們應該明白這兩種序列化的適用場景:
若是是短內容的場景下,使用json做序列化是比較好的方法,不只效率高且更字符串體積更小
若是是在長字符串的場景下,能夠考慮用serialize,程序的執行效率會比json高很多!函數

文末附上swoole課堂的地址,滿滿的乾貨:https://course.swoole-cloud.com/course-video/52高併發

相關文章
相關標籤/搜索