我应该使用关联数组还是对象?

and*_*ber 28 php arrays performance object

众所周知,json_decode您可以选择返回关联数组或对象.在许多其他情况下我们也有两种选择.显然,在某些情况下,根据您正在处理的数据类型(一个项目与项目列表相关的一组数据),使用一个或另一个更"合适".

我想知道的是,在内存,速度等方面,使用一方与另一方的效率有什么不同?我对一个非常大的对象的访问时间特别感兴趣 - 这与一个非常大的数组相比如何?为什么?

对不起,如果之前已经讨论过这个问 我正在写一个基准,可能会告诉我哪一个更好,但不会帮助我理解原因.

Fil*_*efp 46

许多程序员更喜欢使用json_decodetrue作为第二个参数,因为返回的assoc数组与你在javascript中处理对象的方式非常相似.

返回一个正确的对象将需要阅读有关如何使用和不使用的对象,并且因为大多数程序员都非常熟悉更优先的关联数组,特别是如果代码将由开发人员团队维护.代码应易于理解.

关于性能方面的问题我不认为你需要担心,因为大多数(所有)案例中的瓶颈都在其他地方.除非你正在解析一个巨大的字符串,并且我的意思是真的很大,你不应该做任何基准测试.我相信返回一个关联数组与一个合适的对象之间的区别将是次要的.


性能基准(解析)

我在这里发现了一个相当大的json字符串并进行了一些调整以使其更大,最终大小为84 578字节.

然后,我使用两个备选方案(关联数组与对象)解析字符串各1 000次,然后我运行测试三次.结果如下:

第一轮

  JSON object exec: 4.06122 s
  JSON assoc  exec: 3.28679 s
-------------------------------------
assoc is faster by 19.07%
Run Code Online (Sandbox Code Playgroud)

第二轮

  JSON object exec: 4.09614 s
  JSON assoc  exec: 3.29216 s
-------------------------------------
assoc is faster by 19.63%
Run Code Online (Sandbox Code Playgroud)

第3次运行

  JSON object exec: 4.08762 s
  JSON assoc  exec: 3.29960 s
-------------------------------------
assoc is faster by 19.28%
Run Code Online (Sandbox Code Playgroud)

性能基准(读/写)

这个基准测试用于显示哪个stdObject和哪个Array()更快,我使用的解析修改过的json文件(更大的一个)比以前的基准测试更好.

每次读/写测试运行100000次(即,下面给出的代码执行了很多次).

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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

第一轮

  JSON object read/write: 3.05421 s
  JSON assoc  read/write: 2.51932 s
-------------------------------------
assoc is faster by 17.51%
Run Code Online (Sandbox Code Playgroud)

第二轮

  JSON object read/write: 3.06307 s
  JSON assoc  read/write: 2.52701 s
-------------------------------------
assoc is faster by 17.50%
Run Code Online (Sandbox Code Playgroud)

第3次运行

  JSON object read/write: 3.06109 s
  JSON assoc  read/write: 2.52248 s
-------------------------------------
assoc is faster by 17.60%
Run Code Online (Sandbox Code Playgroud)

PHP版本

PHP 5.3.6(cli)(建于2011年8月13日19:04:57)版权所有(c)1997-2011

PHP Group Zend Engine v2.3.0,版权所有(c)1998-2011 Zend

技术

  • 尼斯.升级那个PHP! (2认同)