array_sum在PHP中使用什么算法?

时间:2014-07-29 13:22:48

标签: php arrays algorithm php-internals

数组和使用什么算法使它比某些循环更快?

它是前缀sum / suffix sum还是别的?

3 个答案:

答案 0 :(得分:5)

算法很简单:只需遍历数组并生成元素的总和。而已。就算法而言,没有什么可以说的了。显然,你的复杂性为O(n)

然而,PHP array_sum()是一个已编译的C代码,因此,它将比user-land函数更快。此外,如果您对内部工作方式感兴趣,可以查看array_sum() implementation

for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(input), &pos);
    zend_hash_get_current_data_ex(Z_ARRVAL_P(input), (void **)&entry, &pos) == SUCCESS;
    zend_hash_move_forward_ex(Z_ARRVAL_P(input), &pos)
) {
    if (Z_TYPE_PP(entry) == IS_ARRAY || Z_TYPE_PP(entry) == IS_OBJECT) {
        continue;
    }
    entry_n = **entry;
    zval_copy_ctor(&entry_n);
    convert_scalar_to_number(&entry_n TSRMLS_CC);
    fast_add_function(return_value, return_value, &entry_n TSRMLS_CC);
}

(我只留下了循环部分)。还有fast_add_function() asm优化,您可以查看它的实现here

答案 1 :(得分:1)

它使用与在PHP中编写循环相同的算法(即O(n)线性解决方案),除了在大多数情况下,因为它是本机代码(用C编写)而不是解释,它直接在CPU上运行而不是通过虚拟机(速度慢10到100倍)。

答案 2 :(得分:0)

它使用Big-O O(n)优化。您可能希望在此处查看此excellent answer。您也可以使用Eureqa

等软件自行检查大部分内容