2014-10-08 13 views
6

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 
+2

_ "Usiamo le eccezioni per parte del controllo di flusso" _ quindi devi pagare quel prezzo (e sei fortunato nessuno lancia pietre a LOL) –

+4

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. –

+3

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. –

risposta

-3

Interrompere l'utilizzo delle eccezioni se è necessaria una bassa latenza.

+0

Le eccezioni non influiscono sul tempo di esecuzione se non vengono generate. Bassa latenza può essere raggiunta in modo sicuro con eccezioni. – Alex

+0

Interrompe l'utilizzo delle eccezioni "lente" se superano i requisiti di latenza. Una buona implementazione non ha bisogno di eccezioni "lente". Se la tua implementazione non è buona, allora, beh ... –