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

2020-07-16 17:08:25 +08:00
 frozenway

我把一个 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 格式读取效率更快?

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

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

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

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

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

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

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

当时的需求是做垃圾站用的。
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
2020-07-16 17:46:55 +08:00
encode 感覺差不多, decode 差異比較明顯
leon1900
2020-07-16 17:47:27 +08:00
在我印象中一直是 serialize 效率高一点,json 通用性更强一点,不过这两个串化效率都不太行。
之前看有个人分析过,在 70M 的数组以下 serialize 效率高,大数组 json_encode 效率更爱

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/690636

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX