Прежде чем задать вопрос:
Этот вопрос не о том, насколько полезно использовать dynamic_cast
. Это всего лишь его производительность.Производительность dynamic_cast?
Я недавно разработал дизайн, в котором используется dynamic_cast
.
При обсуждении с коллегами почти все говорят, что dynamic_cast
не следует использовать из-за его плохой производительности (это сотрудники, которые имеют разные фоны и в некоторых случаях не знают друг друга. Я работаю в огромная компания)
Я решил проверить работу этого метода вместо того, чтобы просто верить им. был использован
Следующий код:
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;
Приведенный выше код использует методы из boost::date_time
на Linux, чтобы получить пригодные для использования значения.
Я сделал 3 dynamic_cast
в одном исполнении, код для их измерения одинаковый.
Результаты 1 исполнения были следующие:
Cast1 длится: 74 микросекунд
Cast2 длится: 2 мксек
Cast3 длится: 1 мксек
Первый бросок всегда принимал 74-111 микросекунд, следующее броски в одном исполнении выполняли 1-3 микросекунды.
Итак, наконец, мои вопросы:
Действительно ли dynamic_cast
действительно плохо работает?
Согласно результатам тестирования, его нет. Правильно ли установлен тестовый код?
Почему так много разработчиков думают, что это медленно, если это не так?
Я что-то упустил? Я не вижу никакого кода для cast2 или cast3. – Flexo
Кто может сказать, что плохого? Ваша программа работает достаточно хорошо над всеми? Если да, то производительность неплохая. Общее время в динамике отличает большой процент от времени выполнения? Если нет, то сначала волнуйтесь о других вещах. В более общем плане, 74 микросекунда для некоторых приложений очень медленны - на моем последнем задании я получил и проанализировал всю запись обновления на бирже, обновил базу данных и сообщил об этом клиентским приложениям в половине случаев. Если вас это интересует, сравните его с другими способами, чтобы получить такое же поведение. –
Наличие большого количества динамических кадров в коде является верным индикатором проблем с дизайном. –