V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
frozenway
V2EX  ›  PHP

正儿八经的问题,为什么网上的人说 json_encode 的效率比 serialize 高,而我自己测试则相反? PHP 数组保存在文件应该选择哪种方式比较好?

  •  
  •   frozenway · 2020-07-16 17:08:25 +08:00 · 3344 次点击
    这是一个创建于 1595 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我把一个 php 数组分别保存为 serialize 和 json,然后

    $start = microtime(true);
    for($i = 0; $i < 1000; $i++){
        $ser = file_get_contents('gdip.ser');
        $arr = unserialize($ser);
    }
    $l = microtime(true) - $start;
    echo $l."\n";
    //
    $start = microtime(true);
    for($i = 0; $i < 1000; $i++){
        $json = file_get_contents('gdip.json');
        $arr = json_decode($json, true);
    }
    $l = microtime(true) - $start;
    echo $l."\n";
    

    然后运行得到的结果

    0.939453125
    2.0195319652557
    

    这能不能说明保存成 serialize 格式读取效率更快?

    25 条回复    2020-07-16 17:59:06 +08:00
    2kCS5c0b0ITXE5k2
        1
    2kCS5c0b0ITXE5k2  
       2020-07-16 17:12:48 +08:00
    php5.3 后对 json 有优化 但是还是比 serialize 在数据量大的情况下 要慢
    takemeaway
        2
    takemeaway  
       2020-07-16 17:13:56 +08:00
    不能说明。 你怎么不贴两个文件的大小?
    file_get_contents 占用了时间。
    frozenway
        3
    frozenway  
    OP
       2020-07-16 17:14:08 +08:00
    我这个是在 php7.1 环境下运行的
    virusdefender
        4
    virusdefender  
       2020-07-16 17:16:25 +08:00
    serialize 注意安全问题
    frozenway
        5
    frozenway  
    OP
       2020-07-16 17:16:26 +08:00
    @takemeaway gdip.ser 文件 271K , gdip.json 文件 203K ,他们对应的 php 数组是同一个
    frozenway
        6
    frozenway  
    OP
       2020-07-16 17:17:08 +08:00
    @virusdefender 什么安全问题?
    2kCS5c0b0ITXE5k2
        7
    2kCS5c0b0ITXE5k2  
       2020-07-16 17:21:48 +08:00
    @frozenway 用 json 只是很多情况是因为可移植性强 后期这个文件 可以用任何一个语言来读 用 serialize 就不可以
    sockball07
        8
    sockball07  
       2020-07-16 17:23:57 +08:00
    随便一搜就有相关文章嘛 https://segmentfault.com/a/1190000020755226

    总结是说 serialize 对中文,也就是多字节效率更高

    就记得 serialize 占的空间大一些...
    takemeaway
        9
    takemeaway  
       2020-07-16 17:26:27 +08:00
    我测试是 json 的快,数据量比你小点。

    而且不要用 file 打开。直接变量写上试试。
    MeteorCat
        10
    MeteorCat  
       2020-07-16 17:27:40 +08:00 via Android
    我是默认选用 json,好处是具有通用性,以前项目从 php 用 java 重构之后读写数据库里面的 json 配置毫无压力
    guanhui07
        11
    guanhui07  
       2020-07-16 17:28:12 +08:00
    json_encode 吧
    jfcherng
        12
    jfcherng  
       2020-07-16 17:31:19 +08:00
    > 为什么网上的人说 json_encode 的效率比 serialize 高,而我自己测试则相反?

    可是你測試的是 json_decode
    wangritian
        13
    wangritian  
       2020-07-16 17:33:03 +08:00
    把读盘丢到循环外面再测测
    如果效率没有数量级的差距,推荐 json
    frozenway
        14
    frozenway  
    OP
       2020-07-16 17:35:17 +08:00
    @guanhui07 @jfcherng 这个题目应该改为 json_decode 和 unzerialize
    webshe11
        15
    webshe11  
       2020-07-16 17:37:29 +08:00
    搞安全的提一句,如果数据量不大,使用不频繁,还是用 json 吧,json 比较纯粹,没那么多么蛾子
    反序列化漏洞了解一下
    lovecy
        16
    lovecy  
       2020-07-16 17:39:02 +08:00
    你这个测试例子就很奇怪,file_get_contents 非要写在循环里面,并没有真正的测试单纯的 unseralize 和 json_decode 的性能
    imdong
        17
    imdong  
       2020-07-16 17:40:58 +08:00
    曾经做过测试,忘记这两者那个效率高,但无论用那种方式,都比 return array 效率高处不止一个量级。

    然后最后还是选定了 seralize 保存。

    五年前版本,不代表现在情况。

    当时的需求是做垃圾站用的。
    jfcherng
        18
    jfcherng  
       2020-07-16 17:44:08 +08:00
    https://www.cc1021.com/article/212.html 的 script 測試

    ```
    [USER@PC Desktop]$ php8 -v
    PHP 8.0.0alpha2 (cli) (built: Jul 7 2020 13:53:52) ( NTS Visual C++ 2019 x64 )
    Copyright (c) The PHP Group
    Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0alpha2, Copyright (c), by Zend Technologies

    [USER@PC Desktop]$ php8 test.php
    json : 190
    serialize : 257

    json_encode : 0.010500907897949
    json_decode : 0.046006202697754

    serialize : 0.014501810073853
    unserialize : 0.027003049850464
    ```
    jfcherng
        19
    jfcherng  
       2020-07-16 17:46:55 +08:00
    encode 感覺差不多, decode 差異比較明顯
    leon1900
        20
    leon1900  
       2020-07-16 17:47:27 +08:00
    在我印象中一直是 serialize 效率高一点,json 通用性更强一点,不过这两个串化效率都不太行。
    之前看有个人分析过,在 70M 的数组以下 serialize 效率高,大数组 json_encode 效率更爱
    frozenway
        21
    frozenway  
    OP
       2020-07-16 17:48:23 +08:00
    @lovecy 写在里面是为了测 serialize 文件存储的大小比 json 的大的情况下,读取并反序列成数组的效率比 json 的如何,确保文件大小更大的情况下,依然读取更快
    NerverLibis
        22
    NerverLibis  
       2020-07-16 17:49:34 +08:00 via iPhone
    print_r 序列化 两件套,2020 年还有用 php 的吗
    wnpllrzodiac
        23
    wnpllrzodiac  
       2020-07-16 17:50:07 +08:00 via Android
    google protobuf 啊。json 太落伍了
    durban126
        24
    durban126  
       2020-07-16 17:55:48 +08:00
    重新发一个吧 标题跟内容都不符了
    frozenway
        25
    frozenway  
    OP
       2020-07-16 17:59:06 +08:00   ❤️ 1
    @durban126 不发了,下班走人
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5378 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:09 · PVG 16:09 · LAX 00:09 · JFK 03:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.