Sono stato profiling il mio codice con mutrace e hanno le seguenti interessanti/risultati preoccupanti:Lo stack unwinding richiede realmente i blocchi?
Mutex #1260690 (0x0x7f87bc8eea40) first referenced by:
/usr/lib/mutrace/libmutrace.so(pthread_mutex_lock+0x49) [0x7f87be0b76b9]
/lib/x86_64-linux-gnu/libgcc_s.so.1(_Unwind_Find_FDE+0x26) [0x7f87bc6eb0e6]
mutrace: Showing 10 most contended mutexes:
Mutex # Locked Changed Cont. tot.Time[ms] avg.Time[ms] max.Time[ms] Flags
1260690 19066789 1509831 109753 3600.883 0.000 0.226 M-.--.
La _Unwind_Find_FDE
sembra avere a che fare con una pila di svolgimento.
La mia applicazione è altamente multi-threaded con requisiti di latenza abbastanza severi e quindi vorrei eliminarlo il più facilmente possibile. Ci sono impostazioni del compilatore o dell'ambiente che posso usare per eliminare questa chiamata di funzione, senza riscrivere il mio codice? Usiamo eccezioni per una parte del controllo di flusso (probabilmente incautamente), ma sarebbe un grosso lavoro di refactoring per risolverlo.
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
_ "Usiamo le eccezioni per parte del controllo di flusso" _ quindi devi pagare quel prezzo (e sei fortunato nessuno lancia pietre a LOL) –
Purtroppo penso che avrai per correggere l'errore e non utilizzare le eccezioni per il controllo del flusso nel percorso a caldo. Qualsiasi altra cosa sarebbe un hack. –
Le eccezioni dovrebbero * non * far parte del normale flusso del programma, si suppone che siano * eccezionali *. E se si generano eccezioni, i severi requisiti di latenza non possono essere così rigidi perché lo stack unwinding di solito non è molto efficiente. –