【问题标题】:Is (isset(..) || array_key_exists(...)) a faster way of detecting null values than just array_key_exists(...))?(isset(..) || array_key_exists(...)) 是比 array_key_exists(...)) 检测空值更快的方法吗?
【发布时间】:2012-03-16 19:39:32
【问题描述】:

在研究如何检测数组中的空值时,我在http://www.php.net/manual/en/function.array-key-exists.php 手册页下看到了一些用户的评论。

据说

if (isset(..) || array_key_exists(...))
{
...
}

比做的快

if array_key_exists(...))
{
...
}

100000 次运行的基准标记是

array_key_exists() : 205 ms
is_set() : 35ms
isset() || array_key_exists() : 48ms

我的问题:

(isset(..) || array_key_exists(...))array_key_exists() 快吗? 如果有,为什么?

编辑:在写出这个问题时,我想我找到了答案。我决定还是发布这个问题,看看我的想法是否正确。

【问题讨论】:

  • 1) 在实际使用模式下对它进行基准测试(你知道的,你所问的具体事物)2) [通常] 只是无关紧要(所以写好的代码,而不是它可能是无限小更快在特定条件下的代码)。
  • 如果我们能看到用于每次迭代的 array(),基准测试将意味着更多。
  • 我自己没有运行基准测试,所以我无法为您提供比php.net/manual/en/function.array-key-exists.php 更多的信息,对不起

标签: php arrays isset array-key-exists


【解决方案1】:

哪个更快取决于您正在检查的阵列。如果数组包含 null、"" 或 0 的值

if (isset(..) || array_key_exists(...)){    
}

上面的代码会更快,因为isset会被检查然后执行代码。 Array_key_exists 不会运行。

如果数组包含 null、"" 或 0 值,则将测试 isset,然后测试 array_key_exists。 这将比简单地单独测试 array_key_exists 花费更长的时间。

所以更快的问题很大程度上取决于您正在检查的数组。

很多人都说这并不重要。他们没有解释为什么这并不重要。我猜他们的意思是速度改进是如此之小,以至于不值得打扰。它们也可能意味着哪个更快取决于数组中分配的值(因此每次都不同。)

但最终,如果您知道大多数键将被分配除 null、"" 或 0 以外的值,并且您确实需要确定何时分配 null 值,然后使用

if (isset(..) || array_key_exists(...)){    
}

【讨论】:

    【解决方案2】:

    抱歉,要检测数组中的空值,您可以先使用 in_array 检查数组,它会告诉您数组是否包含“空”。我不太确定你想要实际实现什么,你想找到一个空值还是什么?当您告诉我们更多信息时会进行编辑。

    【讨论】:

    • 该数组肯定会包含空值,因此我将寻找哪些键包含这些空值。但这无关紧要,因为我的问题是“(isset(..)|| array_key_exists(...))比array_key_exists()快,如果是,为什么?”
    【解决方案3】:

    最可靠的方法是isset() || array_ky_exists(),因为它检查的次数最多,短路评估会加快这个过程。

    但是,正如 pst 在 cmets 中所说:It just doesn't matter。真的,到最后几乎没什么区别。

    不过,基本上,不,它不是。最后,基本数学会告诉你,两次检查并不比一次检查快。

    【讨论】:

      猜你喜欢
      • 2018-11-04
      • 1970-01-01
      • 2011-03-13
      • 2023-03-04
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多