文档章节

【宇润日常疯测-003】PHP 序列化和 JSON 哪个更好?

宇润
 宇润
发布于 2018/12/10 19:43
字数 905
阅读 78
收藏 0

有了 Swoole 以后,用我们熟悉的 PHP 就可以很方便地开发网络通信应用。有时候我们系统内部需要交换数据,那么,这时候问题来了,网络通讯的数据格式是选择 JSON 还是 serialize 呢?

一通分析猛如虎

JSON 显然更通用,不用关心通信双方是什么语言。

serialize 也不差,它可以将对象状态保存,在反序列化时恢复状态。这是 JSON 所不能比的。但是每种语言自身的 serialize 几乎都不通用,跨语言通讯行不通。

所以,这里我们暂时只先考虑 PHP 内部系统间的数据交换,用哪个更好呢?

这个问题,没有亲自测试过的人,肯定不能拍着胸脯说出答案。因为我也看了,网上对这两种数据格式公说纷纭。

那么,我也来亲自验证一下吧。当然,结果仅供参考,请根据实际场景选择适合你们项目的数据格式。

代码验证

首先我要说明一下,我选择了几种数据结构,有数组、嵌套数组、对象、对象数组、某API大量数据,尽管挺多的,但是还是有可能考虑不全面。

首先我使用了一个公开api来获取一个大量数据,保存为data.json文件,api地址:https://www.apiopen.top/journalismApi

我的环境:

WSL + PHP 7.2.12

然后跑下面的代码:

<?php
define('TEST_COUNT', 10000);

function test($name, $callable)
{
    $time = microtime(true);
    $callable();
    echo $name, ' time: ', microtime(true) - $time, 's', PHP_EOL;
}

function myTest($name, $data)
{
    echo $name, ':', PHP_EOL;
    $encodeResult = json_encode($data);
    echo 'json_encode size: ', strlen($encodeResult), PHP_EOL;
    test('json_encode', function() use($data){
        for($i = 0; $i < TEST_COUNT; ++$i)
        {
            json_encode($data);
        }
    });
    test('json_decode', function() use($encodeResult){
        for($i = 0; $i < TEST_COUNT; ++$i)
        {
            json_encode($encodeResult);
        }
    });

    $encodeResult = serialize($data);
    echo 'serialize size: ', strlen($encodeResult), PHP_EOL;
    test('serialize', function() use($data){
        for($i = 0; $i < TEST_COUNT; ++$i)
        {
            serialize($data);
        }
    });
    test('unserialize', function() use($encodeResult){
        for($i = 0; $i < TEST_COUNT; ++$i)
        {
            unserialize($encodeResult);
        }
    });
    echo '----------------', PHP_EOL;
}

function test1()
{
    $data = [
        'id'    =>  1,
        'name'  =>  '宇润',
    ];
    myTest(__FUNCTION__, $data);
}

function test2()
{
    $data = [
        [
            'id'    =>  1,
            'name'  =>  '宇润',
        ],
        [
            'id'    =>  2,
            'name'  =>  '路人',
        ],
        [
            'id'    =>  3,
            'name'  =>  '老王',
        ],
        [
            'id'    =>  4,
            'name'  =>  '乌龟',
        ],
        [
            'id'    =>  5,
            'name'  =>  '甲鱼',
        ],
    ];
    myTest(__FUNCTION__, $data);
}

function test3()
{
    $data = new stdClass;
    $data->name = 'testName';
    $data->age = 250;
    $data->hash = md5(250);
    myTest(__FUNCTION__, $data);
}

function test4()
{
    $data = [];
    for($i = 0; $i < 10; ++$i)
    {
        $obj = new stdClass;
        $obj->name = 'testName' . $i;
        $obj->age = $i;
        $obj->hash = md5($i);
        $data[] = $obj;
    }
    myTest(__FUNCTION__, $data);
}

function test5()
{
    $data = json_decode(file_get_contents(__DIR__ . '/data.json'));
    myTest(__FUNCTION__, $data);
}

function test6()
{
    $data = json_decode(file_get_contents(__DIR__ . '/data.json'), true);
    myTest(__FUNCTION__, $data);
}

test1();
test2();
test3();
test4();
test5();
test6();

结果:

test1:
json_encode size: 30
json_encode time: 0.0017490386962891s
json_decode time: 0.0014638900756836s
serialize size: 43
serialize time: 0.0014791488647461s
unserialize time: 0.0049228668212891s
----------------
test2:
json_encode size: 156
json_encode time: 0.0059618949890137s
json_decode time: 0.0056710243225098s
serialize size: 241
serialize time: 0.0055370330810547s
unserialize time: 0.019223928451538s
----------------
test3:
json_encode size: 71
json_encode time: 0.0030298233032227s
json_decode time: 0.0024290084838867s
serialize size: 112
serialize time: 0.0026299953460693s
unserialize time: 0.010625839233398s
----------------
test4:
json_encode size: 711
json_encode time: 0.025734186172485s
json_decode time: 0.024907827377319s
serialize size: 1157
serialize time: 0.022525072097778s
unserialize time: 0.083372831344604s
----------------
test5:
json_encode size: 63741
json_encode time: 1.7440521717072s
json_decode time: 1.8029508590698s
serialize size: 64325
serialize time: 0.82009410858154s
unserialize time: 2.8286778926849s
----------------
test6:
json_encode size: 63741
json_encode time: 1.7795789241791s
json_decode time: 1.7996029853821s
serialize size: 62193
serialize time: 0.69928193092346s
unserialize time: 1.822273015976s
----------------

结论

  • 数据小的情况下,使用 JSON 在体积和性能上更为占优势
  • 当数据大的情况下,使用对象 + serialize 性能更好,体积也稍小
  • unserialize 总是比 serialize 成吨地慢
  • 总的来讲,JSON 还是比较稳的,如果没有恢复对象状态需求的话

结论仅供参考,测试的数据种类还是太少,请结合自身场景来测试和选择

© 著作权归作者所有

宇润

宇润

粉丝 74
博文 18
码字总数 11174
作品 17
无锡
技术主管
私信 提问
加载中

评论(1)

宇润
宇润 博主
世纪性争论的问题
【宇润日常疯测-005】PHP 中的 clone 和 new 性能比较

和本不应该放在一起比较,它们的作用是不同的。但可能有一些场景下,可以用也可以用,那么这时候我们选哪个呢? 我编写了两个测试,第一个是声明一个空类,第二个是带构造方法、属性的类。另...

宇润
2018/12/13
95
1
【宇润日常疯测-006】Array 和 SplFixedArray 比较

的精髓就是数组的运用,数组玩得好可以用于所有数据结构。有个叫的好东西,里面有很多数据结构可供我们使用,并且性能也比我们使用数组实现的要好很多。 今天来看看,顾名思义,固定大小的数...

宇润
01/16
46
0
【宇润日常疯测-002】Redis->eval() 到底好在哪

平时你用 Redis 是不是经常 、一把梭?其实 Redis 中还有很多有用的数据结构,以及各种方法。今天宇润就来测试一下方法。 Redis Eval 官方说明(节选) 从 Redis 2.6.0 版本开始,通过内置的...

宇润
2018/12/07
183
2
宇润/YurunOAuthLogin

YurunOAuthLogin YurunOAuthLogin是一个使用PHP开发集成登录SDK,测试代码可看test目录。 支持的登录平台 QQ 微信 微博 Github 后续将不断添加新的平台支持,也欢迎你来提交PR,一起完善! ...

宇润
2017/08/07
0
0
【宇润日常疯测-001】使用 ; 作为代码缩进符号

这段代码是不是很奇葩,使用作为代码缩进符号但是它是合法的语句,可以正常运行。并且在Java、PHP等语言中,都可以正常使用。 我第一次得知这种写法,是上学时候,Java课老师告诉我们的…… ...

宇润
2018/12/06
47
3

没有更多内容

加载失败,请刷新页面

加载更多

精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
18分钟前
6
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
29分钟前
3
0
jenkins 插件下载加速最终方案

推荐做法 1、告诉jenkins 我哪些插件需要更新 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 1.进入jenkins系统管理 2.进入插件管...

vasks
35分钟前
4
0
composer爆错:zlib_decode():data error

解决办法:先用 composer diagnose 命令检测 然后 composer self-update 更新composer版本 最后执行 composer update 或者 composer install composer 切换阿里云镜像 用起来还快 composer c...

koothon
42分钟前
4
0
shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部