Sto lavorando su un compilatore e vorrei migliorare le sue prestazioni. Ho scoperto che circa il 50% del tempo è dedicato all'analisi dei file sorgente. Dato che il file sorgente è piuttosto piccolo e dopo molte trasformazioni, mi sembra che sia perfetto.Come eseguire il benchmark del parser di Spirit Boost?
Il mio parser è un parser Boost Spirit con un lexer (con lexer :: pos_iterator) e ho una grammatica di medie dimensioni. Sto analizzando la fonte in un AST.
Il mio problema è che non ho idea di cosa impiega più tempo durante l'analisi: copie di nodi AST, lexer, regole del parser o memoria.
Non penso che sia un problema I/O dal momento che sto lavorando su un SSD e che sto leggendo il file interamente all'inizio e quindi utilizzando solo la versione di memoria.
Ho provato ad utilizzare profiler, ma i metodi che richiede tempo sono alcuni metodi da Boost con i nomi centinaia di caratteri e non so esattamente quello che fanno ...
Quindi, c'è un modo preferito per valutare un Boost Spirit Parser e la sua grammatica? O ci sono alcune regole che possono essere utilizzate per verificare l'efficienza in alcuni punti specifici?
Grazie
Fonti per chi è interessato:
Ecco una scrittura da ApochiQ che sta usando Boost.Spirit come l'analizzatore del linguaggio Epoca. Ha notevolmente migliorato le prestazioni del suo parser tra le 10 e le 11 versioni e ha scritto ciò su cui si è concentrato [qui] (http://code.google.com/p/scribblings-by-apoch/wiki/OptimizingBoostSpirit). –
Benchmarking ANYTHING in genere implica l'esecuzione di qualcosa attraverso il "codice sotto test", e quindi l'analisi dei risultati. Se si dispone di un sistema complesso, spesso è utile produrre un "null-driver" o "null-interface", in modo che si possa ad esempio inserire un file sorgente e analizzarlo, senza agire sui risultati analizzati. –
@MatthieuM. Sì, conosco questo articolo Ho già seguito molti consigli di questo grande articolo molto tempo fa. Ma non so quale consiglio seguire dopo. –