【问题标题】:Why is a sorted array slower than a non sorted array in PHP为什么排序数组比 PHP 中的非排序数组慢
【发布时间】:2016-09-08 13:32:22
【问题描述】:

我有以下脚本,我知道“分支预测”的原理,但这里似乎不是这样。

Why is it faster to process a sorted array than an unsorted array?

它似乎反过来工作。

当我在没有 sort($data) 的情况下运行以下脚本时,脚本需要 193.23883700371 秒才能完成。

当我启用 sort($data) 行时,脚本需要 300.26129794121 秒才能完成。

为什么 PHP 会这么慢?我使用 PHP 5.5 和 5.6。 在 PHP 7 中,当 sort() 没有被注释掉时,脚本会更快。

<?php

$size = 32768;
$data = array_fill(0, $size, null);

for ($i = 0; $i < $size; $i++) {
    $data[$i] = rand(0, 255);
}

// Improved performance when disabled
//sort($data);

$total = 0;

$start = microtime(true);

for ($i = 0; $i < 100000; $i++) {
    for ($x = 0; $x < $size; $x++) {
        if ($data[$x] >= 127) {
            $total += $data[$x];
        }
    }
}

$end = microtime(true);
echo($end - $start);

【问题讨论】:

  • 与未排序的数组相比,处理已排序的数组应该更慢,这并没有什么世俗的原因;就 PHP 而言,它们只是数组
  • @SanderVisser 你运行了多少次脚本?可能你对数组排序的时候,127以上的位数比较多,所以求和的时间比较长?
  • 在 PHP 中,数组是一个有序映射。可能的罪魁祸首是,在创建过程中,元素在内存中相对对齐,因此 $data[1] 接近于 $data[2] 排序可能只是重新分配索引键值而不更改值的内存位置。现在 $data[1] 可能与 $data[2] 相距甚远,因此在访问值时内存缓存未命中,并且从内存中加载数据会浪费时间。
  • 在 PHP 中一切都是哈希表,包括数组。我认为排序与否应该没有任何区别。 rand()&gt;= 127 条件肯定会影响性能。
  • 我注意到,如果您在测试中将 sort 调用替换为 shuffle 调用,则结果与 PHP 5 中的结果相似。所以这意味着篡改原始顺序会降低 PHP 5 的性能。

标签: php arrays sorting


【解决方案1】:

基于我上面的 cmets,解决方案是找到或实现一个排序函数,该函数移动值以使内存保持连续并为您提供加速,或者将排序数组中的值推送到第二个数组中,以便新的数组有连续的内存。

【讨论】:

    【解决方案2】:

    假设您的意思是不对实际排序计时,因为您的代码没有计时该操作,所以很难评估任何真正的性能差异,因为您已经用随机数据填充了数组。这意味着一个通道可能有很多大于或等于 127 的值(因此运行一个附加命令)然后另一个通道。要真正比较两者,请用一组相同的固定数据填充您的数组。否则,您永远不会知道随机填充是否导致您看到的时间差异。

    【讨论】:

    • 我可以更新代码以重用完全相同的数组,并且在调用sort() 后它的执行速度会变慢。
    猜你喜欢
    • 2012-12-11
    • 2016-05-03
    相关资源
    最近更新 更多