Proverei per la prima volta con lo Sort::Key
module perché l'ordinamento richiede più tempo del semplice ciclo e della stampa. Inoltre, se le chiavi di hash interne sono (per lo più) identiche, allora dovresti semplicemente preselezionarle, ma suppongo che non sia così, altrimenti lo faresti già.
Dovresti ovviamente provare ad assegnare $ signal_db {$ cycle} anche a un riferimento. È possibile che each
sia più veloce di keys
più il recupero, soprattutto se utilizzato con Sort::Key
. Verificerei se la mappa fosse più veloce di foreach
, probabilmente la stessa cosa, ma chi lo sa. È possibile trovare print
più veloce se si passa un elenco o si chiama più volte.
Non ho provato questo codice, ma gettare insieme tutte queste idee, tranne each
dà:
foreach my $cycle (nsort keys %signal_db) {
my $r = $signal_db{$cycle};
map { print ($r->{$_},$_,"\n"); } (nsort keys %$r);
}
C'è un articolo su di smistamento in perl here, controlla la Trasformata di Schwartz, se si vuole vedere come una potrebbe utilizzare each
.
Se il codice non deve essere attenti alla sicurezza, allora si potrebbe plausibilmente disattivare la protezione di Perl contro algorithmic complexity attacks impostando PERL_HASH_SEED o legati variabili e/o ricompilare Perl con regolazione alterata, così keys
e values
comandi che di Perl restituite le chiavi o valori in ordine già ordinato, risparmiando così tempo considerevole per ordinarli. Ma per favore guarda this 28C3 talk prima di farlo. Non credo nemmeno che funzionerà, dovresti leggere questa parte del codice sorgente di Perl, forse più semplicemente implementando il tuo loop in C.
fonte
2012-01-15 18:16:54
Grazie per 3 risposte molto utili e dettagliate! Vorrei poterli accettare tutti :) –