如何加快PHPmath?

我试图从这里直接从JavaScript转换成PHP的基准短代码

使用Javascript:

(function() { var a = 3.1415926, b = 2.718; var i, j, d1, d2; for(j=0; j<10; j++) { for(i=0; i<100000000; i++) { a = a + b; } } console.log("a = " + a); })(); 

PHP:

 <?php $a = 3.1415926; $b = 2.718; for($j=0; $j<10; $j++) { for($i=0; $i<100000000; $i++) { $a = $a + $b; } } echo "a = $a\n"; 

在控制台(我的Macbookterminal,节点v5.7.0 vs PHP 7.0.4)上运行,结果是相当令人费解的:

 $ time node test.js a = 2717999973.76071 real 0m1.340s user 0m0.912s sys 0m0.021s $ time php t.php a = 2717999973.7607 real 2m40.239s user 2m35.271s sys 0m0.507s 

基本math运算中的PHP真的比节点120倍 ? 有什么可以做的,以优化呢?

这个

虽然我不能解释JavaScript和PHP之间的巨大差异,但是我能够通过一个小小的改变,使PHP代码的处理速度提高大约30%。

在本地运行一些testing后,我改变了

 $a = $a + $b; 

 $a += $b; 

运行时间为53-55秒,从78-80(在我的机器上 – i5 8GB RAM和慢速磁盘)下降。 使用类似的储蓄估计(四舍五入到25%)应该使处理总共大约2分钟。 显然这不像JavaScript时间那么接近。

取决于你真实想要运行什么(因为基准testing只能告诉你很多),你可以做出其他的改进,但并不总是这么大。

JavaScript的编译速度接近1:1,因此10 ^ 9循环中没有太多肉,运行速度与CPU允许的速度相同(此处为2.14s,旧节点版本为v0.10.25)。

另一方面,PHP做了很多,特别是Zend机器。 如果你用VLD转储你的小程序的操作码,你会得到(php 7.0.5):

 $ php -d vld.active=1 -d vld.execute=0 -f benchmark.php Finding entry points Branch analysis from position: 0 Jump found. Position 1 = 14 Branch analysis from position: 14 Jump found. Position 1 = 16, Position 2 = 4 Branch analysis from position: 16 Jump found. Position 1 = -2 Branch analysis from position: 4 Jump found. Position 1 = 10 Branch analysis from position: 10 Jump found. Position 1 = 12, Position 2 = 6 Branch analysis from position: 12 Jump found. Position 1 = 16, Position 2 = 4 Branch analysis from position: 16 Branch analysis from position: 4 Branch analysis from position: 6 Jump found. Position 1 = 12, Position 2 = 6 Branch analysis from position: 12 Branch analysis from position: 6 filename: benchmark.php function name: (null) number of ops: 21 compiled vars: !0 = $a, !1 = $b, !2 = $j, !3 = $i line #* EIO op fetch ext return operands ------------------------------------------------------------------------------------- 2 0 E > ASSIGN !0, 3.14159 3 1 ASSIGN !1, 2.718 5 2 ASSIGN !2, 0 3 > JMP ->14 6 4 > ASSIGN !3, 0 5 > JMP ->10 7 6 > ADD ~8 !0, !1 7 ASSIGN !0, ~8 6 8 POST_INC ~10 !3 9 FREE ~10 10 > IS_SMALLER ~11 !3, 100000000 11 > JMPNZ ~11, ->6 5 12 > POST_INC ~12 !2 13 FREE ~12 14 > IS_SMALLER ~13 !2, 10 15 > JMPNZ ~13, ->4 10 16 > ROPE_INIT 3 ~15 'a+%3D+' 17 ROPE_ADD 1 ~15 ~15, !0 18 ROPE_END 2 ~14 ~15, '%0A' 19 ECHO ~14 20 > RETURN 1 branch: # 0; line: 2- 5; sop: 0; eop: 3; out1: 14 branch: # 4; line: 6- 6; sop: 4; eop: 5; out1: 10 branch: # 6; line: 7- 6; sop: 6; eop: 9; out1: 10 branch: # 10; line: 6- 6; sop: 10; eop: 11; out1: 12; out2: 6 branch: # 12; line: 5- 5; sop: 12; eop: 13; out1: 14 branch: # 14; line: 5- 5; sop: 14; eop: 15; out1: 16; out2: 4 branch: # 16; line: 10- 10; sop: 16; eop: 20; out1: -2 path #1: 0, 14, 16, path #2: 0, 14, 4, 10, 12, 14, 16, path #3: 0, 14, 4, 10, 6, 10, 12, 14, 16, 

你的两个版本之间的区别是

 1,10c1,10 < branch: # 0; line: 2- 5; sop: 0; eop: 3; out1: 14 < branch: # 4; line: 6- 6; sop: 4; eop: 5; out1: 10 < branch: # 6; line: 7- 6; sop: 6; eop: 9; out1: 10 < branch: # 10; line: 6- 6; sop: 10; eop: 11; out1: 12; out2: 6 < branch: # 12; line: 5- 5; sop: 12; eop: 13; out1: 14 < branch: # 14; line: 5- 5; sop: 14; eop: 15; out1: 16; out2: 4 < branch: # 16; line: 10- 10; sop: 16; eop: 20; out1: -2 < path #1: 0, 14, 16, < path #2: 0, 14, 4, 10, 12, 14, 16, < path #3: 0, 14, 4, 10, 6, 10, 12, 14, 16, --- > branch: # 0; line: 2- 5; sop: 0; eop: 3; out1: 13 > branch: # 4; line: 6- 6; sop: 4; eop: 5; out1: 9 > branch: # 6; line: 7- 6; sop: 6; eop: 8; out1: 9 > branch: # 9; line: 6- 6; sop: 9; eop: 10; out1: 11; out2: 6 > branch: # 11; line: 5- 5; sop: 11; eop: 12; out1: 13 > branch: # 13; line: 5- 5; sop: 13; eop: 14; out1: 15; out2: 4 > branch: # 15; line: 10- 10; sop: 15; eop: 19; out1: -2 > path #1: 0, 13, 15, > path #2: 0, 13, 4, 9, 11, 13, 15, > path #3: 0, 13, 4, 9, 6, 9, 11, 13, 15, 

它( $a += $b )只是使用一个不同的,稍微慢一点的(!)path。 是的,慢一点:我的testing给了17s。 为$a = $a + $b和20s。 为$a += $b 。 虽然很重要,但并不多。 对JavaScript也没什么不同。

两分钟你的PHP版本是相当大的,即使是一个旧的PHP-5在40秒内在这里。 ChangLogs中找不到任何东西,但是如果可能的话,你可以尝试更新。 或者如果你自己编译它,请尝试不同的优化,因为MAC与“普通”PC不同。

math速度差异为您的结果来自几个因素。

主要是,Javascript是从最终用户机器运行,速度将取决于该机器。

在PHP中,代码是从服务器资源运行,因此取决于它的能力(主要是CPU)来摧毁这些数字。

在大多数情况下,PHP通常会受到服务器资源的伤害,因为许多提供商都不愿意环绕它们的环境。

尽pipe如此,任何单个问题的PHP会稍微慢一些,因为与Javascript相比,PHP的背景更多。 使用JS的代码不会运行,直到所有资源加载。

PHP的任务是加载Apache,然后PHP,然后解释你的代码。 因此,更多的事情发生在PHP端。