【发布时间】: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()和>= 127条件肯定会影响性能。 -
我注意到,如果您在测试中将
sort调用替换为shuffle调用,则结果与 PHP 5 中的结果相似。所以这意味着篡改原始顺序会降低 PHP 5 的性能。