我有以下脚本,我知道原则"分支预测"但似乎并非如此。
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);
答案 0 :(得分:2)
基于我上面的评论,解决方案是找到或实现一个排序函数,该函数移动值以使内存保持连续并为您提供加速,或者将排序数组中的值推送到第二个数组中以便新数组有连续的内存。
答案 1 :(得分:1)
假设您没有考虑实际排序的时间,因为您的代码没有对该操作进行计时,因此您很难评估任何真正的性能差异,因为您已经使用随机数据填充了数组。这意味着一次传递可能有更多值大于或等于127(因此运行另一个命令)然后另一次传递。要真正比较两者,请使用一组相同的固定数据填充数组。否则,您永远不会知道随机填充是否会导致您看到的时差。