2013-01-14 95 views
9

我有用PHP編寫的腳本和用Javascript編寫的相同腳本。
它迭代一百萬次,每次將一個字符串剝離到一個數組中,並將第一個數組項賦給一個新的變量。迭代腳本中的內存消耗

的PHP是:

class First 
{ 
public function Iterate() 
{ 
    $count = 1000000; 
    $test_string = ''; 
    $test_array = ''; 
    $first_word = ''; 
    for($i=1; $i <= $count; $i++){ 
     $test_string = 'This is a test string'; 
     //could use explode but no explode in js 
     $test_array = split(" ", $test_string); 
     $first_word = $test_array[0]; 
    } 
} 
} 
$first = new First(); 
$first->Iterate(); 

和JavaScript是:

function First() { 
this.Iterate = function() { 
    count = 1000000; 
    test_string = ''; 
    test_array = ''; 
    first_word = ''; 
    for(var i=1;i <= count; i++){ 
        test_string = 'This is a test string'; 
        test_array = test_string.split(" "); 
        first_word = test_array[0]; 
    } 
} 
} 
first = new First(); 
first.Iterate(); 

我運行PHP用PHP-CLI 5.3.10與節點v0.6.12的JavaScript。

對於PHP,我使用'memory_get_usage()',對於Javascript我使用'process.memoryUsage()'。我在腳本的開始處運行它們,然後在最後,然後減去結尾並開始,最後將字節數轉換爲mb。

PHP使用0.00065 mb的內存,而Javascript使用0.25 mb,但PHP需要4秒,JavaScript需要0.71秒。我在兩臺不同的機器上運行了結果。

有沒有人知道爲什麼Javascript的內存使用量會比PHP的高很多(儘管Javascript的執行速度非常快)?

我能想出的惟一解釋是V8的使用性質隱藏類提高了速度但增加了內存消耗。

+1

只是說明:腳本不一樣。 php函數中的變量是私有的,在js中是全局變量。 –

+1

您的測試示例不像它們可能的那樣相似。在JavaScript中您應該將您的Iterate方法應用爲First的原型對象的一部分......這樣您不會在每次執行時重新創建方法(這更接近於PHP的行爲方式)。 – Pebbl

+1

@pebbl謝謝。類似於First.prototype.Iterate = function() –

回答

1

因爲它們是非常不同的執行環境。

在PHP的情況下,源代碼被轉換爲一系列操作碼 - 類似於p代碼,而v8使用JIT編譯器。後者往往會更加profilgate內存使用,但我懷疑內存使用2之間最大的差別是由於垃圾收集不同的策略:

$test_array = split(" ", $test_string); 

test_array = test_string.split(" "); 

創建在每次迭代結束時被丟棄的堆棧中的對象。

既不能提供很多訪問來控制運行時內存使用量。

+0

謝謝,我們將修改局部變量,使其在每次迭代中的變化不同,並且看看當棧的數量現在會增加時會產生什麼。 –