【发布时间】:2019-05-03 02:16:49
【问题描述】:
偶然发现so thread 我决定用 PHP 编写类似的测试。 我的测试代码是这样的:
// Slow version
$t1 = microtime(true);
for ($n = 0, $i = 0; $i < 20000000; $i++) {
$n += 2 * ($i * $i);
}
$t2 = microtime(true);
echo "n={$n}\n";
// Optimized version
$t3 = microtime(true);
for ($n = 0, $i = 0; $i < 20000000; $i++) {
$n += $i * $i;
}
$n *= 2;
$t4 = microtime(true);
echo "n={$n}\n";
$speedup = round(100 * (($t2 - $t1) - ($t4 - $t3)) / ($t2 - $t1), 0);
echo "speedup: {$speedup}%\n";
结果
- 在 PHP
2 * ($i * $i)版本中的运行与2 * $i * $i非常相似,
所以 PHP 解释器没有将字节码优化为 Java 中的 JVM - 即使我手动优化代码 - 我也有 ~
8%加速,当 Java 版本获得 ~16%加速。所以 PHP 版本在 Java 代码中获得了大约 1/2 的加速因子。
优化原理
我不会详细介绍,但是优化和未优化代码中的乘法比率是 ->
1 总和:3/4
2 个总和:4/6
3 个总和:5/8
4 个总结:6/10
...
一般来说:
其中 n 是循环中的求和数。要成为对我们有用的公式 - 我们需要在 N 接近无穷大时计算它的极限(以复制我们在循环中进行大量求和的情况)。所以:
因此我们得出结论,在优化后的代码中,乘法必须减少 50%。
问题
- 为什么 PHP 解释器没有应用代码优化?
- 为什么 PHP 的加速因子只有 Java 的一半?
【问题讨论】:
标签: php bytecode micro-optimization