測試 PHP 裡的 serialize 函式效能
這次比較的有最常用的三種方式
PHP內建的serialize
還有json_encode
另一個可能有人不知道
叫 igbinary
這東西在PHP5時代
效能可是海放 PHP 內建的 serialize
但是在效能大耀進的PHP 7上呢?
馬上來做個實驗看看
這次是在AWS上的t2.micro做測試
php版本是7.1
PHP 7.1.11 (cli) (built: Oct 25 2017 10:00:47) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.1.11, Copyright (c) 1999-2017, by Zend Technologies
我總共測試了 7 種資料模式
包括:
- 全是數字的陣列
- 全是字串的陣列
- 全是數字的多維陣列
- 全是字串的多維陣列
- 參雜數字跟字串的多維陣列
- 單純的物件
- 多層次的物件
以下就是測試結果
Array with number
define('ARRAY_SIZE', 300);
define('TEST_TIME', 100);
serialize time: 0.0010788440704346
unserialize time: 0.0027780532836914
json_encode time: 0.00069093704223633
json_decode time: 0.0027239322662354
igbinary_serialize time: 0.00054502487182617
igbinary_unserialize time: 0.00051093101501465
serialize: igbinary_serialize > json_encode > serialize
unserialize: igbinary_unserialize > json_decode > unserialize
Array with string
define('ARRAY_SIZE', 300);
define('STR_LENGTH', 100);
define('TEST_TIME', 100);
serialize time: 0.0014660358428955
unserialize time: 0.0031919479370117
json_encode time: 0.02100396156311
json_decode time: 0.019490003585815
igbinary_serialize time: 0.0020298957824707
igbinary_unserialize time: 0.001331090927124
serialize: serialize > igbinary_serialize > json_encode
unserialize: igbinary_unserialize > unserialize > json_decode
Multi level array with number
define('ARRAY_SIZE', 300);
define('ARRAY_DEEP', 30);
define('TEST_TIME', 10);
serialize time: 0.0074031352996826
unserialize time: 0.020796060562134
json_encode time: 0.0040719509124756
json_decode time: 0.021830081939697
igbinary_serialize time: 0.0094568729400635
igbinary_unserialize time: 0.0080678462982178
serialize: json_encode > serialize > igbinary_serialize
unserialize: igbinary_unserialize > json_decode > unserialize
Multi level array with string
define('ARRAY_SIZE', 300);
define('ARRAY_DEEP', 30);
define('STR_LENGTH', 100);
define('TEST_TIME', 10);
serialize time: 0.011026859283447
unserialize time: 0.023138999938965
json_encode time: 0.069886922836304
json_decode time: 0.076200008392334
igbinary_serialize time: 0.019577980041504
igbinary_unserialize time: 0.013104915618896
serialize: serialize > igbinary_serialize > json_encode
unserialize: igbinary_unserialize > unserialize > json_decode
Multi level array with number and string
define('ARRAY_SIZE', 300);
define('ARRAY_DEEP', 30);
define('STR_LENGTH', 100);
define('TEST_TIME', 10);
serialize time: 0.013853073120117
unserialize time: 0.033852100372314
json_encode time: 0.072479009628296
json_decode time: 0.086339950561523
igbinary_serialize time: 0.025516033172607
igbinary_unserialize time: 0.014665126800537
serialize: serialize > igbinary_serialize > json_encode
unserialize: igbinary_unserialize > unserialize > json_decode
Object
define('OBJ_PROP_SIZE', 300);
define('TEST_TIME', 100);
serialize time: 0.0015609264373779
unserialize time: 0.0032401084899902
json_encode time: 0.022146940231323
json_decode time: 0.022933006286621
igbinary_serialize time: 0.0033202171325684
igbinary_unserialize time: 0.0027999877929688
serialize: serialize > igbinary_serialize > json_encode
unserialize: igbinary_unserialize > unserialize > json_decode
Multi level object
define('OBJ_PROP_SIZE', 100);
define('OBJ_DEEP_SIZE', 30);
define('TEST_TIME', 100);
serialize time: 0.015815019607544
unserialize time: 0.036242008209229
json_encode time: 0.22513890266418
json_decode time: 0.23918008804321
igbinary_serialize time: 0.056578159332275
igbinary_unserialize time: 0.032699108123779
serialize: serialize > igbinary_serialize > json_encode
unserialize: igbinary_unserialize > unserialize > json_decode
結論
serialize 在 php7 效能有很大的改善
在很多測試中甚至超越 igbinary
但是在 unserialize 的部分仍然是 igbinary 佔有優勢
json_encode和json_decode在遇到大資料處理的時候效能很差
若要當成serialize的function可能要三思了
留言