由于在这个so线程上遇到了困难,我决定用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";
2*($i*$i)
版本中运行与2*$i*$i
非常相似,8%
的加速比,而Java的版本有~16%
的加速比。所以PHP版本的加速系数是Java代码的1/2。我不想多说细节,但优化和未优化代码的乘法比是->
1求和:3/4
2求和:4/6
3求和:5/8
4求和:6/10
...
一般情况下:
其中n是循环中的求和数。要成为对我们有用的公式--当N接近无穷大时,我们需要计算它的极限(以复制我们在一个循环中做大量求和的情况)。所以:
是时候分析由PHP解释器生成的PHP操作码了。为此,您需要安装VLD扩展,并使用它从命令行生成手头的php脚本操作码。
$i++
与++$i
并不相同。报表$I++;生成操作码:POST_INC ~4 !1 FREE ~4
将计数器增加1并将前一个值保存到内存插槽#4中。然后,因为这个值从未使用过--从内存中释放它。问题--为什么我们需要储存价值,如果它从来没有被使用过?
while (true) {
// Slow version
$t1 = microtime(true);
for ($n = 0, $i = 0; $i < 2000; $i+=10) {
// loop unrolling
$n += 2 * (($i+0) * ($i+0));
$n += 2 * (($i+1) * ($i+1));
$n += 2 * (($i+2) * ($i+2));
$n += 2 * (($i+3) * ($i+3));
$n += 2 * (($i+4) * ($i+4));
$n += 2 * (($i+5) * ($i+5));
$n += 2 * (($i+6) * ($i+6));
$n += 2 * (($i+7) * ($i+7));
$n += 2 * (($i+8) * ($i+8));
$n += 2 * (($i+9) * ($i+9));
}
$t2 = microtime(true);
echo "{$n}\n";
// Optimized version
$t3 = microtime(true);
for ($n = 0, $i = 0; $i < 2000; $i+=10) {
// loop unrolling
$n += ($i+0) * ($i+0);
$n += ($i+1) * ($i+1);
$n += ($i+2) * ($i+2);
$n += ($i+3) * ($i+3);
$n += ($i+4) * ($i+4);
$n += ($i+5) * ($i+5);
$n += ($i+6) * ($i+6);
$n += ($i+7) * ($i+7);
$n += ($i+8) * ($i+8);
$n += ($i+9) * ($i+9);
}
$n *= 2;
$t4 = microtime(true);
echo "{$n}\n";
$speedup = round(100 * (($t2 - $t1) - ($t4 - $t3)) / ($t2 - $t1), 0);
$table[$speedup]++;
echo "****************\n";
foreach ($table as $s => $c) {
if ($s >= 0 && $s <= 20)
echo "$s,$c\n";
}
}
所以脚本最有可能得到10%的加速。这意味着我们的优化带来了+2%的加速(而原始脚本是8%)。
我非常肯定我所做的所有这些事情--可以由PHP JIT自动完成。我认为在生成二进制可执行文件时,将一对post_inc/free操作码自动改为一个PRE_INC操作码并不困难。另外,PHP jit'er可以应用循环展开也不是奇迹。这只是优化的一个开始!
希望在PHP8.0中有一个JIT
问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码:
我用Xtext写了一个DSL。我想要的是执行DSL,从中获得一些好的结果。 我编写了myDslGenerator类,在xtend中实现接口IGenerator,以生成java代码,它运行良好。 我有两个问题; 解释器和代码生成器有什么区别?不都是为了执行DSL吗? 如何编写一个解释器?有没有一步一步的教程链接?我找到了许多使用xint生成代码的教程,但找不到任何用于编写解释器的教程。 谢谢你, 萨
我希望这将是一个有用的页面,开始运行php代码,并解决当前的问题,我有一些非常简单的代码如下: 这被上传到一个运行apache的ec2网站上。代码不会被解释,当您查看页面的源代码时,它会显示php代码。 你可以看到这一页。 有什么想法吗?php代码非常基本,我认为它可能与apache配置有关。请让我知道你需要的任何额外信息,我会提供它,希望告诉我如何得到它。
如何在PHP Smarty中优化这段代码? 现在我有一个代码让我困惑,有一个简单的代码。 当我搜索需要推送值的代码时。 优化如何发挥作用?我能写到数组吗?如果它可以写入数组,我该怎么办?
我在Spring boot中有一些关于飞行前过滤器的代码,但我不知道这段代码的用途: 这是该文件的解释: 因此,当Angular 2发送http post ajax调用时,它将首先发送一个pre-flight并且方法类型不是“post”而是“Options”。如果这个预飞行有一个有效的响应,那么它将开始发送真正的http POST。这是为了防止跨站点攻击。在后端,spring对此没有开箱即用的处理
据我所知,直线的意思是,那个变量运动得到乘以向量inputVec的x部分的绝对值,但我不明白接下来会发生什么。