2014-09-22 7 views
5

Ecco lo scenario: recentemente mi è stato assegnato il compito di scrivere un'interfaccia di comunicazione per dispositivi seriali rs232 per la nostra applicazione esistente. Questa applicazione ha classi di base in atto per fare la comunicazione reale. Fondamentalmente tutto ciò che faccio è accettare un array di byte nella mia classe, quindi elaborarlo.È una cattiva idea convertire gli array di byte in stringhe e analizzare le espressioni regolari?

Parte del problema è che l'array di byte consegnato non può essere più di 1000 byte alla volta, ma potrebbero esserci più dati in attesa di entrare che appartengono a quella transazione. Quindi non ho idea se ciò che mi è stato consegnato sia completo. Quello che sto facendo è convertire quell'array da 1000 byte in una stringa e inserirla in un buffer. Questo buffer quindi esegue un'espressione regolare per vedere se ciò che è stato aggiunto crea una transazione completa. So che è completo se corrisponde a una firma particolare (fondamentalmente una serie di codici di controllo all'inizio e alla fine). Questo buffer aggiungerà i dati solo fino a 3 volte prima di rinunciare se non viene trovata alcuna corrispondenza in caso di dati spazzatura che arrivano e nessuna corrispondenza è mai possibile. Questo non è un dispositivo ad alto volume di dati, quindi non mi aspetto che tonnellate di dati continuino a riversarsi costantemente. E l'espressione regolare viene eseguita sempre, al massimo, 3000 caratteri.

Finora funziona piuttosto bene, ma la mia domanda è che le espressioni regolari sono terribili per questo? Ci sono delle ramificazioni riguardo alle prestazioni per quello che le sto usando? La mia comprensione è che le espressioni regolari sono in genere dannose per grandi volumi di dati, ma ritengo che questo sia piuttosto limitato.

+0

hai un esempio di codice esistente che stai utilizzando ..? questo è piuttosto astratto per me, dal momento che si possono usare molti metodi o tecniche diverse per leggere byte ad esempio 'ReadAllBytes' oppure i byte vanno letti in Chunk ecc. hai fatto anche una ricerca su google per altri esempi esistenti? Sono sicuro che non sei il primo ad averlo provato, quindi sostanzialmente quello che sto dicendo è "Non reinventare il WHeel" – MethodMan

+1

Come stai "convertendo quell'array da 1000 byte in una stringa"? Si noti che non tutti gli array di byte sono stringhe valide. –

+2

A seconda di quanto siano complessi e prevedibili i codici di controllo, prenderei in considerazione solo l'osservazione diretta dei valori dei byte sia più facile che più veloce. Ma non c'è niente di intrinsecamente sbagliato nel tuo approccio. –

risposta

5

sono espressioni regolari terribile per questo?

Al contrario, le espressioni regolari sono grandi per la corrispondenza di modelli in sequenze di dati.

Ci sono delle ramificazioni riguardo alle prestazioni per quello che le sto usando?

Le espressioni regolari possono essere scritte in modi davvero inefficienti, ma di solito è un problema con una particolare espressione regolare, non con espressioni regolari come tecnica.

La mia comprensione è che le espressioni regolari sono in genere dannose per grandi volumi di dati, ma ritengo che questo sia piuttosto limitato.

Non esiste una definizione universale di "grande" e "piccolo". A seconda del motore regex, l'espressione viene solitamente tradotta in una macchina a stati descritta dall'espressione. Queste macchine sono veramente efficienti in quello che fanno, nel qual caso la dimensione del blocco dati può essere molto considerevole. D'altra parte, si potrebbe scrivere una regex con un sacco di backtracking, causando prestazioni inaccettabili anche su stringhe di input di centinaia di caratteri o meno.

3

niente di quello che stai facendo è alzare bandiere rosse.

Alcune cose da tenere a mente

  • Non preoccupare te stesso con le prestazioni. È sufficiente progettare prima il programma e ottimizzare le prestazioni in seguito, e farlo solo se si verificano problemi di prestazioni.

  • Alcune attività non sono adatte per le espressioni regolari. Le espressioni regolari non possono analizzare XML molto bene, e anche non in grado di analizzare i modelli come X n Y n Senza sapere precisamente cosa si sta cercando di abbinare per il tuo regex, non posso davvero analizzare se è adatto al tuo problema. Stai attento a non avere nessun caso limite.

  • Il regex non va bene per grandi quantità di dati non è qualcosa che ho sentito prima, e ho cercato in giro online, non sto ancora trovando molti avvertimenti contro di esso.

  • Normalmente, la soluzione più semplice è la migliore. Se riesci a pensare ad una soluzione più semplice e diretta al tuo problema, prosegui con quello. In caso contrario, non preoccuparti troppo.

Problemi correlati