记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高并发

相关文章
相关标签/搜索