2013-01-14 17 views
9

Ho uno script scritto in PHP e lo stesso script scritto in Javascript.
It ita un milione di volte e ogni volta rimuove una stringa in una matrice e assegna il primo elemento dell'array in una nuova variabile.Consumo di memoria su uno script di iterazione

Il 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(); 

E il 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(); 

corro PHP con PHP-CLI 5.3.10 ed il Javascript con il nodo v0.6.12.

Per PHP utilizzo 'memory_get_usage()' e per Javascript utilizzo 'process.memoryUsage()'. Li eseguo all'inizio dello script, quindi alla fine, quindi meno fine con start e infine converti il ​​numero di byte in mb.

Il PHP utilizza 0,00065 mb di memoria mentre Javascript utilizza 0,25 mb, tuttavia PHP richiede 4 secondi e Javascript richiede 0,71 secondi. Ho eseguito i risultati su 2 macchine diverse.

Qualcuno sa perché l'utilizzo della memoria Javascript sarebbe molto più alto di quello del PHP (nonostante il fatto che Javascript sia eseguito molto più velocemente)?

L'unica spiegazione che ho potuto fare è stata la natura del V8 di utilizzare le classi nascoste per migliorare la velocità ma aumentare il consumo di memoria.

+1

solo una nota: gli script non sono la stessa cosa. i vars all'interno della funzione php sono privati, in js sono globali. –

+1

Gli esempi di test non sono simili come potrebbero essere. Nel JavaScript dovresti applicare il tuo metodo Iterate come parte dell'oggetto prototipo di First ... in questo modo non stai ricreando il metodo su ogni esecuzione (che è più vicina al comportamento di php). – Pebbl

+1

@pebbl grazie. Qualcosa come First.prototype.Iterate = function() –

risposta

1

Perché sono ambienti di esecuzione molto diversi.

Nel caso di PHP, la sorgente viene convertita in una serie di codici opzionali - un po 'come il p-code, mentre la v8 usa un compilatore JIT. Quest'ultimo tendono ad essere più profilgate con l'utilizzo della memoria, ma ho il sospetto che la più grande differenza tra il 2 per utilizzo della memoria è a causa di criteri diversi per la raccolta dei rifiuti:

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

e

test_array = test_string.split(" "); 

creare un oggetto sulla pila che viene scartato alla fine di ogni iterazione.

Nessuno dei due fornisce molto accesso al controllo dell'utilizzo della memoria di runtime.

+0

grazie, andando a modificare la variabile locale in modo che sia diversa per ogni iterazione e vedere che cosa produce come lo stack aumenterà correttamente ora. –

Problemi correlati