Prima di leggere la domanda:
Questa domanda non riguarda quanto sia utile usare dynamic_cast
. È solo per le sue prestazioni.Prestazioni di dynamic_cast?
Ho recentemente sviluppato un progetto in cui viene utilizzato molto il dynamic_cast
.
Quando si parla con i colleghi, quasi tutti dicono che lo dynamic_cast
non deve essere utilizzato a causa delle sue cattive prestazioni (si tratta di colleghi con background diversi e in alcuni casi non si conoscono. società enorme)
Ho deciso di testare le prestazioni di questo metodo invece di crederci.
Il seguente codice è stato utilizzato:
ptime firstValue(microsec_clock::local_time());
ChildObject* castedObject = dynamic_cast<ChildObject*>(parentObject);
ptime secondValue(microsec_clock::local_time());
time_duration diff = secondValue - firstValue;
std::cout << "Cast1 lasts:\t" << diff.fractional_seconds() << " microsec" << std::endl;
Il codice sopra usa metodi da boost::date_time
su Linux per ottenere i valori utilizzabili.
Ho eseguito 3 dynamic_cast
in un'unica esecuzione, il codice per misurarli è lo stesso.
I risultati di 1 esecuzione sono stati i seguenti:
Cast1 dura: 74 microsec
Cast2 dura: 2 microsec
Cast3 dura: 1 microsec
Il primo getto sempre prese 74-111 microsec, il seguente i calchi nella stessa esecuzione richiedevano 1-3 microsec.
Quindi finalmente le mie domande:
dynamic_cast
si comporta davvero male?
Secondo il test, non lo è. Il mio codice test è corretto?
Perché così tanti sviluppatori pensano che sia lento se non lo è?
Mi manca qualcosa? Non riesco a vedere alcun codice per cast2 o cast3. – Flexo
Chi può dire cosa c'è di male? Il tuo programma funziona abbastanza bene? Se è così, allora le prestazioni non sono male. Il tempo totale in versioni dinamiche è una grande percentuale del tempo di esecuzione? In caso contrario, preoccupati prima di altre cose. Più in generale, 74 microsecondi sono terribilmente lenti per alcune applicazioni: nel mio ultimo lavoro, avrei ricevuto e analizzato un intero record di aggiornamento dalla borsa, aggiornato il database e detto alle app client in tempo reale. Se sei interessato, confrontalo con altri modi per ottenere lo stesso comportamento. –
Avere molti dynamic_cast nel codice è un indicatore sicuro dei problemi di progettazione. –