2010-04-05 15 views
6

nella scrittura di un motore di scripting, ho funzioni come (pseudo-codice)Confronto Regex vs. Manuale. Quale è più veloce?

function is_whitespace?(char c){ 
    return c==' ' || c=='\t' || c=='\r' || c=='\n'; 
} 

Beh, la mia domanda è che è più veloce nella maggior parte dei langugaes? Che o usando espressioni regolari come

function is_whitespace?(char c){ 
    return regex_match('\s',c); 
} 

Le lingue principali che mi preoccupa sono C#, C, e Ruby anche nel caso in cui esso è completamente dipendente dalla piattaforma.

+2

Sembra abbastanza semplice da dare un rapido test per scoprirlo. Genera un file pieno di caratteri casuali e passa attraverso entrambe le funzioni. –

+0

Penso che intendessi "\ s" invece di "\ w" lì. – sepp2k

+0

sì, questo è vero .. Mono dovrà essere sufficiente per il test C# anche se .. – Earlz

risposta

11

Ovviamente quattro confronti di piccoli blocchi di memoria sono molto più veloci (e quasi senza memoria) rispetto alla costruzione, all'esecuzione e alla distruzione di una macchina a stati.

+0

+1. Nota che esempi più complessi potrebbero essere più veloci per usare la regex. –

+0

Bene, quando Regex ha battuto (ingenuo) confronti manuali? – Earlz

+3

La mia ipotesi non è mai, ma codificare a mano un matcher per un normale linguaggio potrebbe diventare molto complicato rispetto alla scrittura di un'espressione regolare. – danben

1

Nella maggior parte dei casi, la regex per trovare qualcosa come un carattere di spazio bianco è molto veloce. Ci sono molti occhi che guardano alle prestazioni nelle principali implementazioni regex e probabilmente ci sono altre aree di "low hanging fruit" per l'ottimizzazione in altre aree del tuo codice.

Le aree di cattiva esecuzione di una regex sono una regex scritta male. I suggerimenti sono di evitare il più possibile il backtracking, il raggruppamento e l'alterazione. Usa qualcosa come "Regex Buddy" o Perl con "usa re debug" per vedere quanti rami prende l'espressione regolare.

I collegamenti riguardano alcuni problemi di prestazioni regex.

In caso di dubbio, fare tempi comparativi ...

Coding Horor- Regex

Java Performance - Regex

3

Il confronto manuale è più veloce da eseguire, il confronto regex è più veloce a digitare.

Si noti che le due implementazioni non sono equivalenti se il sistema utilizza Unicode. Il regex \s corrisponde a tutti gli spazi bianchi Unicode mentre il confronto manuale gestisce solo ASCII di base e non include nemmeno i caratteri di tabulazione verticale e di avanzamento modulo che di solito sono considerati anche spazi bianchi.

Se si sta scrivendo questo in un linguaggio di alto livello, suggerirei di utilizzare la funzione is_whitespace() già fornita dalle librerie del linguaggio di programmazione. Una funzione di base come quella è quasi sempre inclusa.

Quindi alla fine la risposta è "dipende". In alcune situazioni è giustificato lo sforzo supplementare di programmazione sull'uso del codice procedurale. In molti casi la regex è abbastanza veloce e facile da mantenere.

+0

Non dipende da questo se l'implementazione di Regex è compatibile con Unicode? (e la tua lingua. Ad esempio, penso che Ruby non sia ancora in grado di riconoscere unicode) – Earlz

+0

Ho detto: "se il tuo sistema usa Unicode". Con ciò intendevo sia il linguaggio di programmazione che il sapore regex. L'aroma regex in Ruby 1.8 non supporta Unicode, quello in Ruby 1.9. –

1

dopo l'utilizzo del disco, le regex sono quasi sempre il collo di bottiglia delle mie prestazioni quando registro il mio codice. anche per cose semplici come .split ("").

0

Non posso parlare di C# o C, ma non assumerei che il modulo non-regex sia più veloce in Ruby.

Problemi correlati