<?php
// Proposal idea of enabling the unrolling in the userland.
function measure(string $label, callable $fn): void {
$start = hrtime(true);
$result = $fn();
$end = hrtime(true);
$elapsed = ($end - $start) / 1e9;
echo "Sum: {$result}, {$label}: " . number_format($elapsed, 6) . " seconds\n";
}
$array = range(1, 1e6);
$n = count($array);
measure("Normal for loop", function () use ($array, $n) {
$sum = 0;
for ($i = 0; $i < $n; $i++) {
$sum += $array[$i];
}
return $sum;
}); // Sum: 500000500000, Normal for loop: 0.047172 seconds
measure("Manual Unrolled x4", function () use ($array, $n) {
$sum = 0;
for ($i = 0; $i < $n; $i += 4) {
$sum += $array[$i] + $array[$i + 1] + $array[$i + 2] + $array[$i + 3];
}
return $sum;
}); // Sum: 500000500000, Manual Unrolled x4: 0.042200 seconds
measure("Manual Unrolled x8", function () use ($array, $n) {
$sum = 0;
for ($i = 0; $i < $n; $i += 8) {
$sum += $array[$i] + $array[$i + 1] + $array[$i + 2] + $array[$i + 3]
+ $array[$i + 4] + $array[$i + 5] + $array[$i + 6] + $array[$i + 7];
}
return $sum;
}); // Sum: 500000500000, Manual Unrolled x8: 0.036472 seconds
// Attributed Unroll - this is handled by your modified compiler
measure("Attributed Unrolled #[Unroll(4)]", function () use ($array, $n) {
$sum = 0;
// @TODO: KhaledAlam: Unrolling logic of zend_compile_for( )
// #[Unroll(4)]
for ($i = 0; $i < $n; $i++) {
$sum += $array[$i];
}
return $sum;
}); // Sum: 0, Attributed Unrolled #[Unroll(4)]: 0.000002 seconds
preferences:
28.28 ms | 407 KiB | 5 Q