Przed przeczytaniem pytania:
To pytanie nie dotyczy tego, jak użyteczne jest użycie dynamic_cast
. Chodzi tylko o jego wydajność.Wydajność dynamic_cast?
Niedawno opracowałem projekt, w którym bardzo często używany jest kod dynamic_cast
.
Podczas dyskusji ze współpracownikami prawie wszyscy mówią, że dynamic_cast
nie powinien być używany z powodu jego złych wyników (są to współpracownicy, którzy mają różne pochodzenie, aw niektórych przypadkach nie znają się nawzajem. ogromna firma)
Postanowiłem przetestować działanie tej metody zamiast im tylko uwierzyć.
Poniższy kod został wykorzystany:
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;
Powyższy kod używa metody z boost::date_time
na Linuksie, aby uzyskać wartości użytkowej.
Zrobiłem 3 dynamic_cast
w jednym wykonaniu, kod do ich pomiaru jest taki sam.
Wyniki 1 realizacją były następujące:
Cast1 trwa: 74 microsec
Cast2 trwa: 2 microsec
Cast3 trwa: 1 microsec
Pierwszy odlew zawsze brał 74-111 microsec następujący rzuty w tej samej egzekucji trwały 1-3 mikrosekundy.
W końcu moje pytania:
Czy dynamic_cast
naprawdę działa źle?
Zgodnie z wynikami testu jego nie. Czy mój kod testowy jest poprawny?
Dlaczego tak wielu programistów uważa, że jest powolny, jeśli tak nie jest?
Czy brakuje mi czegoś? Nie widzę żadnego kodu dla cast2 lub cast3. – Flexo
Kto może powiedzieć, co jest złe? Czy twój program działa wystarczająco dobrze na wszystkich? Jeśli tak, to wydajność nie jest zła. Czy łączny czas w dynamicznych rzutach stanowi duży procent twojego czasu wykonania? Jeśli nie, to najpierw przejmuj się innymi rzeczami. Ogólnie rzecz biorąc, 74 mikrosekundy są bardzo powolne w przypadku niektórych aplikacji - w mojej ostatniej pracy otrzymywałbym i analizował cały rekord aktualizacji z giełdy, aktualizował bazę danych i powiadamiał o tym aplikacje klienckie o połowę krótszym. Jeśli jesteś zainteresowany, porównaj to z innymi sposobami uzyskania tego samego zachowania. –
Posiadanie wielu dynamic_casts w kodzie jest pewnym wskaźnikiem problemów projektowych. –