众所周知,json_decode
为您提供返回关联数组或对象的选项。在许多其他情况下,我们也有这两种选择。显然,在某些情况下,根据您正在处理的数据类型(一组数据与一个项目相关的数据与项目列表相关的数据),使用一个或另一个更“合适”。
我想知道的是,在内存、速度等方面,使用一个与另一个的效率有什么不同吗?我对非常大的对象的访问时间特别感兴趣 - 与非常大的数组相比如何,为什么?
很抱歉,如果之前已经讨论过这个问题,搜索结果一无所获。我正在编写一个基准,它可能会告诉我哪个更好,但不会帮助我理解原因。
最佳答案
许多程序员更喜欢使用 true
作为 json_decode 的第二个参数因为返回的 assoc 数组 与您在 javascript 中处理对象的方式非常相似。
返回一个正确的对象将需要阅读如何使用和不使用的内容,并且由于大多数程序员都非常熟悉关联数组,这是更可取的,特别是如果代码将由一组开发人员维护时。代码应该易于理解。
关于性能问题,我认为您无需担心,因为大多数(所有)情况下的瓶颈都在其他地方。除非你正在解析一个巨大的字符串,我的意思是非常大,否则你不需要做任何基准测试。我相信返回关联数组与返回适当对象之间的区别很小。
性能基准(解析)
我发现了一个相当大的 json 字符串 here并做了一些调整使其更大,最终大小为 84 578 字节。
然后我使用两种替代方法(关联数组与对象)分别解析字符串 1000 次,然后我运行了 3 次测试。结果如下:
第一次运行
JSON object exec: 4.06122 s
JSON assoc exec: 3.28679 s
-------------------------------------
assoc is faster by 19.07%
第二次运行
JSON object exec: 4.09614 s
JSON assoc exec: 3.29216 s
-------------------------------------
assoc is faster by 19.63%
第三轮
JSON object exec: 4.08762 s
JSON assoc exec: 3.29960 s
-------------------------------------
assoc is faster by 19.28%
性能基准(读/写)
这个基准测试是为了显示 stdObject
和 Array()
哪个更快,我使用的是经过解析的修改后的 json 文件(比之前的更大)基准。
每个读/写测试都运行了 100 000 次(即下面给出的代码执行了那么多次)。
json_decode ($json_data)
for ($i =0; $i < 24; ++$i){
$a = $object[$i]->user->profile_sidebar_border_color . "stackoverflow";
$object[$i]->nested->entities->user_mentions[0]->indices[$i&1] += 1;
}
json_decode ($json_data, true)
for ($i =0; $i < 24; ++$i){
$a = $assoc[$i]['user']['profile_sidebar_border_color'] . "stackoverflow";
$assoc[$i]['nested']['entities']['user_mentions'][0]['indices'][$i&1] += 1;
}
第一次运行
JSON object read/write: 3.05421 s
JSON assoc read/write: 2.51932 s
-------------------------------------
assoc is faster by 17.51%
第二次运行
JSON object read/write: 3.06307 s
JSON assoc read/write: 2.52701 s
-------------------------------------
assoc is faster by 17.50%
第三轮
JSON object read/write: 3.06109 s
JSON assoc read/write: 2.52248 s
-------------------------------------
assoc is faster by 17.60%
PHP 版本
PHP 5.3.6 (cli) (built: Aug 13 2011 19:04:57) Copyright (c) 1997-2011
The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend
Technologies
关于php - 我应该使用关联数组还是对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8498114/