最近看swoole官方课程的时候,有一小节专门讲了json_decode函数的效率。它慢的原因是需要遍历文本中的每一个字符来寻找EOF(endoffile:文本流的结尾,关于EOF的文章阮一峰有详细解释),而且只有在确定了格式之后以及整个字符串的长度,json格式是可以解码的,也就是说,假设整个字符串的长度为N,那么程序要遍历N+1次。如果有一些高并发的场景,有没有更好的解决方案?另一个常用的关于序列化的函数是serialize。序列化后,serialize会一一记录序列化字符串中值的类型和长度。如果按照这个思路,serialize和deserialize应该可以直接按照之前生成的字符格式化,而不用遍历全文找EOF。在长字符串的情况下,unserialize是否比json_decode更高效?于是我做了下面的实验,用三种数组数据作为测试,不是中文、英文、数字,分别序列化和反序列化成一个循环进行测试,这里的底数是循环次数:$array=["I'magooPHP免费且使用广泛。同时,PHP绝对是微软ASP等竞争者的另一个高效选择。PHP非常适合网站开发,其代码可以直接嵌入HTML代码。","我是一个goodboy.","a"=>"PHP是免费的并且被广泛使用。此外,与MicrosoftASP等竞争对手相比,PHP绝对是另一种高效的选择。PHP非常适合网站开发,其代码可以直接嵌入HTML代码中",2=>"PHP是免费的并且被广泛使用。此外,对于像MicrosoftASP这样的竞争对手,PHP绝对是另一个有效的选择。PHP非常适合网站开发,它的代码可以直接嵌入到HTML代码中",'PHP是免费的并广泛使用。同时,对于微软ASP等竞争对手来说,PHP无疑是又一个高效的选择。PHP极其适合网站开发,其代码可以直接嵌入HTML代码',"我是好孩子","我是好孩子","我是好孩子","我是个好孩子。","我是个好孩子","asdfnsadofhasd"];$array=["我是男孩","我是男孩","我是男孩","我是男孩","我是男孩","我是男孩","我是男孩","我是男孩","我是男孩","我是男孩",];$array=[0=>9115,1=>9115,2=>9115,3=>9115,4=>9115,5=>9115,6=>9115,7=>9115,8=>9115,9=>9115,];得到的试验结果如下。可以看出,在英文和数字的序列化中,json的序列化效率是serialize的2-3倍,而在中文数组的测试中,serialize的效率是json的8-10倍,这也印证了之前的猜测:json在序列化和反序列化数据的时候,字符串长度越长,cpu需要执行的次数越多才能找到EOF,而序列化是因为在序列化转换的时候记录了字符串的长度,所以反序列化的时间会比json少,但是serialize也有自己的缺点:1.因为在序列化的时候记录了对应字符串的长度和长度类型,所以在同样的数据下,serialize会比json占用更多的空间,以空间换取时间。2、serialize的序列化内容,可读性不如json,排错的时候比较麻烦。看到这里,大家应该明白这两种序列化的适用场景了:如果是短内容场景,使用json序列化是比较好的方法,不仅效率高,而且字符串体积更小。如果是长字符串场景,可以考虑使用serialize,程序的执行效率会比json高很多!文末附上swoole课堂地址,干货满满:https://course.swoole-cloud.com/course-video/52
