从数组中提取变量对性能不利吗?

Posted

技术标签:

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

我发现了 php 中很棒的 extract 函数,我认为它真的很方便。但是我了解到,PHP 中的大多数优点也会影响性能,所以我的问题是,从性能的角度来看,使用 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() 肯定有性能缺陷。

【讨论】:

以上是关于从数组中提取变量对性能不利吗?的主要内容,如果未能解决你的问题,请参考以下文章

选择所有列对性能不利吗?

ES6解构赋值 (数组 , 对象)

数组的解构赋值

PowerShell,从变量中提取多个数组以生成单个变量

数组的解构赋值

ES6 之 数组的解构赋值