【问题标题】:Is it bad for performance to extract variables from an array?从数组中提取变量对性能不利吗?
【发布时间】:2011-02-21 12:54:25
【问题描述】:

我发现了 PHP 中很棒的 extract 函数,我认为它真的很方便。但是我了解到,PHP 中的大多数优点也会影响性能,所以我的问题是,从性能的角度来看,使用 extract 会产生哪些影响?

大型应用程序从数组中提取变量是禁忌吗?

【问题讨论】:

  • 这真的取决于你如何使用它。请提供代码示例?

标签: php performance variables arrays extract


【解决方案1】:

更新

正如下面的评论者所指出的,并且多年后我现在敏锐地意识到 - php 变量 在写入时复制。但是,在全局范围内提取防止变量被垃圾收集。所以正如我之前所说,“考虑你的范围”


取决于数组的大小和提取它的范围,假设您将一个巨大的数组提取到全局命名空间,我可以看到这会产生影响,因为您将所有这些数据都存储在内存中两次 - 我相信尽管它可能会做一些有趣的内部事情,而 PHP 会做这些事情来限制它 -

但说你做到了

function bob(){
    extract( array( 'a' => 'woo', 'b' =>'fun', 'c' => 'array' ) );
}

它不会产生真正持久的影响。

长话短说,只需考虑您在做什么、为什么要这样做以及范围。

【讨论】:

  • Php 变量带来了写时复制,没有理由在提取后它们需要在内存中多次存在,或者值本身需要复制。您对此进行了测试还是假设?
【解决方案2】:

extract 不应用于不受信任的数据。而且它通常对受信任的数据没有用处(因为已知数组键的数量可能有限)。

【讨论】:

    【解决方案3】:

    我不明白为什么它会对性能造成如此大的影响,只要您不在大循环中提取巨大的数组。 但我也从来没有找到使用提取物的理由:)

    【讨论】:

      【解决方案4】:

      在大多数语言中使用数组要好得多,因为编译器和/或解释器可以使用 SIMD 指令。

      此外,您可能会注意到,如果您的代码的某些部分尝试为数组中的每个值调用一个函数。从性能的角度来看,只调用一次函数并打包所有值会更有效。如果数组太长,多次调用函数的开销会增加,并且更难检测到可能的优化

      【讨论】:

      • extract 主要用于关联数组,而不是数字索引数组。所以我认为 SIMD 不适用。
      • @Matthew 即使使用关联数组,for-each 类型的循环也会通过 SIMD 得到提升(可以同时处理多个键)
      【解决方案5】:

      我曾经不得不调试一个崩溃的脚本;事实证明,PHP 内存不足。

      部分问题在于extract() 被用于包含 25000 个元素的循环中。在内存不足之前,它只能通过大约 2300 个元素。我用手动设置变量替换了提取(4 个元素的关联数组),循环能够通过大约 5200 条记录。

      所以extract() 肯定有性能缺陷。

      【讨论】:

        猜你喜欢
        • 2020-10-26
        • 1970-01-01
        • 2018-03-25
        • 2010-11-04
        • 2022-10-19
        • 1970-01-01
        • 1970-01-01
        • 2014-09-25
        • 2012-02-28
        相关资源
        最近更新 更多