2009-11-18 15 views
13

Sto cercando un confronto delle prestazioni tra perl e incrementa l'espressione regolare.
Ho bisogno di progettare un pezzo di codice che si basa pesantemente sulle espressioni regolari, e possono scegliere tra:Prestazioni di espressioni regolari: Boost vs. Perl

  1. esecuzione attraverso una spinta regex
  2. invio di un interprete Perl e fare il lavoro in perl

So che perl è noto per l'elaborazione ottimizzata delle stringhe. Tuttavia, non riesco a trovare un confronto delle prestazioni per aumentare la libreria delle espressioni regolari.
Sei a conoscenza di un simile confronto?
Grazie

+2

Quando si parla delle espressioni regolari di Perl, si sta chiedendo informazioni sull'interprete Perl o su PCRE (espressioni regolari compatibili con Perl)? –

+0

PCRE sarà probabilmente molto buono per te. Tuttavia, se necessario, è anche possibile collegarsi a Perl stesso e ottenere l'accesso ai suoi interni regex. Tuttavia non ci sono garanzie sull'usabilità dell'API. –

+1

Provate entrambi. Il particolare tipo di espressioni regolari di cui hai bisogno e i dati faranno molta differenza. – igouy

risposta

12

Il costo di avvio di gestione di un interprete Perl dall'interno dell'applicazione (tramite la funzione di sistema che presumo) supererà qualsiasi vantaggio ottenuto utilizzando il motore regex di Perl. L'eccezione sarebbe se hai un'espressione regolare MOLTO complicata che l'implementazione delle espressioni regolari di Perl sembra essere ottimizzata, ma il motore regex di Boost non lo è.

La vera risposta è che non conosco alcun confronto di questo tipo, ma le strutture per le espressioni regolari di Perl non sono necessariamente le più veloci. Vedere here per alcune informazioni su un algoritmo che batte l'espressione regolare di Perl per alcune espressioni.

MODIFICA: È possibile superare il costo di avvio di avviare un interprete perl completo collegandosi a libperl o utilizzando libPCRE. E l'utilizzo di boost probabilmente ti darà più flessibilità e opzioni di ottimizzazione delle prestazioni se ne hai bisogno.

Nota finale: non sono noti confronti diretti tra boost.regex e regex di Perl in termini di prestazioni. La soluzione è provare entrambi e vedere quale è più performante per la situazione specifica dell'OP.

(Edit:. V'è ora un buon confronto tra il Boost e PCRE Vedere http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/gcc-performance.html)

+1

Puoi anche collegarti a libperl e usare le espressioni regolari di Perl senza avere il sovraccarico dell'intero interprete Perl.L'API potrebbe non essere progettata per questo, ma è certamente possibile. –

+0

C'è anche libPCRE: http://www.pcre.org/ – greyfade

+1

Tecnicamente, PCRE ha alcune leggere differenze rispetto alle espressioni regolari di Perl, ma sono casi limite. Scommetterei che le regex di Perl sono leggermente più veloci, ma dubito che importi. –

8

Se non l'hai ancora visto, c'è un regexp benchmark in the Great Language Shootout. Non classifica Perl molto in alto. Un'implementazione Boost che utilizza boost::xpressive è classificata per prima (che precompila l'espressione al momento della compilazione). Tuttavia, questo è un microbenchmark, quindi probabilmente non rappresentativo della velocità generale di espressione regolare, ma vale comunque la pena dare un'occhiata.

Sorprendentemente, a quanto pare il più veloce motore delle espressioni regolari è di gran lunga di Google Chrome V8 JavaScript JIT (quasi batte GCC in tempo orologio a muro, utilizzando solo una CPU core singolo)

+3

Dubito seriamente che il benchmark delle regex sia accurato. Non ho mai visto il motore regex di Python più performante di quello di Perl. –

+1

Qualcuno ha contribuito ora con un benchmark Boost, ed è al primo posto. Qualcuno ha contribuito a questo oggi? –

+2

Inoltre, ci sono due versioni di Perl che si verificano nella sezione "Alternative interessanti" che sono più veloci di qualsiasi altra cosa. –

0

L'interprete Perl sta per essere un costo fisso. Se il tempo risparmiato eseguendo i tuoi dati attraverso l'interprete supera di gran lunga i costi dell'interprete (cioè, hai molti dati), avrai un incremento delle prestazioni.

È probabile che tu stia meglio con il C++ puro qui, solo a causa dell'invocazione del processo.

Siamo spiacenti, non ho dati. Mi piace vedere i risultati del test.

2

A meno che la regex non sia complessa (per cui il motore di regex di Perl è incredibilmente veloce tra l'altro), come altri hanno detto, il sovraccarico è in avvio dell'interprete. D'altra parte è possibile eseguire un perl persistente che fornisce un server regex abbastanza facilmente.

6

Se le espressioni regolari sono corrette al momento della compilazione, è possibile considerare anche Boost.XPressive. Consente di scrivere espressioni regolari come modelli di espressione analizzati in fase di compilazione.

3

Inizia con la soluzione più semplice. Decidi quanto deve essere veloce per la tua applicazione. Quindi misurare la velocità. Se è troppo lento, prova la soluzione più difficile. Misura di nuovo. Ripeti se necessario.

Mentre il mio istinto concorda con la maggior parte delle altre risposte che dicono che l'avvio dell'interprete sarà più costoso, non lo saprai mai fino a quando non misuri.

C'è "il più veloce possibile" e "abbastanza veloce per la vostra applicazione". Non aggiungere complessità per ottenere il primo se hai già quest'ultimo.

+0

PCRE-JIT è il più veloce là fuori, ma manca l'ottimizzazione del testo (funzione perl study()) e ciò può avere un grande impatto per alcune applicazioni. –

1

Se hai davvero bisogno di tempo puoi ottenere un coprocessore di contenuti REGEX. Ce ne sono due che io conosco. Titanic crea una gamma di processori. Un altro è fatto da Cavium. E infine, LSI ha acquistato un'azienda più piccola e sta spedendo una riga di regular expression matching processors.

Questi sistemi possono eseguire migliaia di espressioni regolari in parallelo, anziché una alla volta. La parte più costosa del loro utilizzo è lo spostamento della memoria verso di loro e il loro spostamento indietro, e la gestione dei limiti di blocco, ecc.

Ma se le prestazioni sono un problema, è consigliabile provare queste soluzioni.

+0

A lil più di quanto ho bisogno, ma davvero interessante! Grazie! –