Stavo scrivendo un parser di file in Perl, quindi ho dovuto eseguire il loop del file. Il file è costituito da record a lunghezza fissa e volevo creare una funzione separata che analizzi il dato dato e chiami quella funzione in un ciclo. Tuttavia, il risultato finale è diventato lento con file di grandi dimensioni e la mia ipotesi era che non dovrei usare la funzione esterna. Così ho fatto alcune prove preparatorie con e senza chiamata di funzione in un ciclo:perché le chiamate di funzione in Perl vanno in loop così lentamente?
[A]
foreach (1 .. 10000000) {
$a = &get_string();
}
sub get_string {
return sprintf("%s\n", 'abc');
}
[B]
foreach (1 .. 10000000) {
$a = sprintf "%s\n", 'abc';
}
misurazione ha dimostrato che un codice viene eseguito circa 3-4 volte più lento del codice B. Sapevo in anticipo che il codice A doveva funzionare più lentamente, ma sono rimasto sorpreso che la differenza fosse così grande. Ho anche provato a eseguire test simili con Python e Java. Nel codice Python un equivalente era di circa il 20% più lento di B e il codice Java scorreva più o meno alla stessa velocità (come previsto). La modifica della funzione da Sprint a qualcos'altro non ha mostrato alcuna differenza significativa.
Esiste un modo per aiutare Perl a eseguire tali cicli più velocemente? Sto facendo qualcosa di completamente sbagliato qui o è la caratteristica di Perl che le chiamate di funzione sono così generali?
quello che, appunto, non get_string() fare? – eruciform
@roe Supponiamo che si tratti di uno stub e non si è utilizzato 'sprintf' solo per incollare una nuova riga su una stringa costante. Sarebbe sciocco. Quindi cosa fa veramente? – Schwern
strano, il mio schermo formattato in modo strano, non era lì prima. firefox goof .. – eruciform