2010-03-22 18 views
2

我有一個PHP腳本的集合,這些腳本的CPU密集程度非常高,可以同時處理數百個用戶的數百萬計算。什麼是循環/賦值與C相比變慢?

我試圖找到一種方法來加快PHP變量賦值的內部和循環序列VS C.

雖然PHP顯然是鬆散類型,有什麼辦法/擴展到專門指定類型(轉讓,不是演員,這似乎更昂貴)在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); 

}

不言自明 - 它通過的59十億的任意數量的循環了100萬次,倍數每次迭代中,分配給它到一個變量並打印出來。

我的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內部在原始類型和循環上更加「原生」嗎?

+1

可能是你必須優化你的算法一點?例如,從數百萬計算到數十萬計算? – 2010-03-22 07:02:56

+0

我沒有完全解釋算法/需求,主要是因爲它對主題有點矯枉過正,但實際上在成千上萬的用戶中有超過100,000+的同時計算......我編寫了上面的代碼來模擬100,000,000個連續的循環用任意數字乘以簡化示例,並且證明我對速度差異的觀點,並不意味着我沒有考慮過減少計算......儘管我同意這通常是非常好的編碼建議適用於任何項目。 – 2010-03-22 08:37:23

回答

4

簡短的回答是否定的,不可能以您想要的方式加速PHP代碼。優化代碼幾乎肯定會更好,因此您不必首先執行如此龐大的數字操作。

長的回答是,如果您決定以艱難的(不明智的)方式做事情,您可以做兩件事。

  • 你可以寫你的代碼作爲PHP的擴展,在C.
  • 您可以使用類似HipHop
+0

關於HipHop的說明 - 我將上面的內容編譯到了HipHop,它只能*略微提高性能......它仍然在13+秒範圍內。 – 2010-03-22 08:34:18

1

這就是動態語言的折衷。它們比C/C++慢很多,你無法做任何事情。這不僅限於PHP。例如Ruby或Javascript有同樣的問題。

在處理PHP中的複雜代碼時,您可以做很多優化,但這些非常簡單的循環不會更快。

有一些項目試圖構建一個編譯器,它可以從PHP代碼中生成本地二進制文件(比如Facebook「HipHop」http://developers.facebook.com/news.php?story=358&blog=1),但它們仍在開發中。

+0

類型推理編譯器可以使它們與C一樣快,但PHP還沒有。 – 2010-03-22 07:17:53

+0

丹尼爾,很好的電話,這幾乎是我問的 - 有沒有什麼方法可以編譯類型,所以不需要翻譯人員花費1億次。似乎是未來PHP版本的重點! – 2010-03-22 08:52:44

相關問題