V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
frozenway
V2EX  ›  PHP

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

  •  
  •   frozenway · Jul 16, 2020 · 4152 views
    This topic created in 2121 days ago, the information mentioned may be changed or developed.

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

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

    就记得 serialize 占的空间大一些...
    takemeaway
        9
    takemeaway  
       Jul 16, 2020
    我测试是 json 的快,数据量比你小点。

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

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

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

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

    当时的需求是做垃圾站用的。
    jfcherng
        18
    jfcherng  
       Jul 16, 2020
    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  
       Jul 16, 2020
    encode 感覺差不多, decode 差異比較明顯
    leon1900
        20
    leon1900  
       Jul 16, 2020
    在我印象中一直是 serialize 效率高一点,json 通用性更强一点,不过这两个串化效率都不太行。
    之前看有个人分析过,在 70M 的数组以下 serialize 效率高,大数组 json_encode 效率更爱
    frozenway
        21
    frozenway  
    OP
       Jul 16, 2020
    @lovecy 写在里面是为了测 serialize 文件存储的大小比 json 的大的情况下,读取并反序列成数组的效率比 json 的如何,确保文件大小更大的情况下,依然读取更快
    NerverLibis
        22
    NerverLibis  
       Jul 16, 2020 via iPhone
    print_r 序列化 两件套,2020 年还有用 php 的吗
    wnpllrzodiac
        23
    wnpllrzodiac  
       Jul 16, 2020 via Android
    google protobuf 啊。json 太落伍了
    durban126
        24
    durban126  
       Jul 16, 2020
    重新发一个吧 标题跟内容都不符了
    frozenway
        25
    frozenway  
    OP
       Jul 16, 2020   ❤️ 1
    @durban126 不发了,下班走人
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   930 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 92ms · UTC 20:07 · PVG 04:07 · LAX 13:07 · JFK 16:07
    ♥ Do have faith in what you're doing.