循环/分配对C的影响有多大?

时间:2010-03-22 06:37:12

标签: php optimization

我有一些非常占用大量CPU的PHP脚本,在数百个并发用户中处理数百万次计算。

我正试图找到一种方法来加速PHP变量赋值的内部,并循环序列与C。

虽然PHP显然是松散类型的,但有没有任何方式/扩展来专门分配类型(assign, not cast,这看起来更昂贵)以C风格的方式?

这就是我的意思。

这是C中的一些虚拟代码:

#include <stdio.h>

int main() {
unsigned long add=0;

for(unsigned long x=0;x<100000000;x++) {
    add = x*59328409238;
}
printf("x is %ld\n",add);

}

非常不言自明 - 它循环1亿次,每次迭代乘以约590亿的任意数,将其分配给变量并打印出来。

在我的Macbook上,编译并运行它会产生:

lees-macbook-pro:Desktop lee$ time ./test2
x is 5932840864471590762

real    0m0.266s
user    0m0.253s
sys  0m0.002s

相当快!

PHP 5.3 CLI中的类似脚本...

<?php
for($i=0;$i<100000000;$i++){
    $a=$i*59328409238;
}
echo $a."\n";
?>

...制作:

lees-macbook-pro:Desktop lee$ time /Applications/XAMPP/xamppfiles/bin/php test3.php
5.93284086447E+18

real    0m22.837s
user    0m22.110s
sys  0m0.078s

超过22秒vs 0.2!

我意识到PHP比这个简单的C程序在幕后做得更多 - 但是有没有办法让PHP内部在原始类型和循环上表现得更“原生”?

3 个答案:

答案 0 :(得分:4)

简短的回答是否定的,不可能以您想要的方式加速PHP代码。优化代码几乎肯定更好,因此您不必首先进行如此繁重的数值运算。

答案很长,如果你决定以艰难(不明智的方式)做事,你可以做两件事。

  • 您可以在C。
  • 中将您的代码编写为PHP的扩展
  • 您可以使用HipHop
  • 之类的内容

答案 1 :(得分:1)

这是动态语言的权衡。它们比C / C ++慢很多,你无法做任何事情。这不仅限于PHP。例如,Ruby或Javascript也存在同样的问题。

在处理PHP中的复杂代码时,您可以进行大量优化,但这些非常简单的循环不会更快。

有些项目尝试构建一个使用PHP代码生成本机二进制文件的编译器(如Facebook“HipHop”http://developers.facebook.com/news.php?story=358&blog=1),但它们仍在开发中。

答案 2 :(得分:0)

也许这可能让您感兴趣:http://developers.facebook.com/news.php?story=358&blog=1

他们开发了将PHP转换为本机代码的编译器。应该有助于你的情况。

此项目托管在github上:http://wiki.github.com/facebook/hiphop-php/