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

标签 php arrays performance object

众所周知,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%

性能基准(读/写)

这个基准测试是为了显示 stdObjectArray() 哪个更快,我使用的是经过解析的修改后的 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/

相关文章:

PHP pg_prepare() 表名作为参数

javascript - AngularJS hashbang 模式复制 URL 路径

java - 将csv文件内容存储到多个数组中

arrays - 算法 - 检查字符串数组中的任何字符串是否是同一数组中任何其他字符串的前缀

c++ - .NET 4、C++、if...else 和 switch() 对性能的影响

javascript - 如果我在 for 循环中调用一个包含 for 循环的函数,那是 O(n^2) 时间还是 O(n)?

php - 如何在 Laravel 4 中创建自定义 Facade

php - .htaccess 301 重定向添加一个额外的斜杠

arrays - SWIFT:具有 "direct"访问权限的快速阵列

python - 何时迭代集合,或何时使用数据库