Насколько быстро dynamic_cast <> - PullRequest
9 голосов
/ 20 марта 2012

... приблизительно по сравнению с типичным std::string::operator==()? Ниже я приведу некоторые подробности, я не уверен, имеют ли они какое-либо отношение. Ответ со сложностью или приближением достаточно хорош. Спасибо!

Подробности: Я буду использовать его внутри цикла for над списком, чтобы найти некоторые конкретные экземпляры. Я оцениваю свой средний уровень наследования в 3,5 класса. У того, который я ищу, есть родительский класс, прародитель и, кроме того, два «интерфейса», т. Е. Для абстрактных классов с парой virtual void abc() = 0;.

Нет подкласса для того, кого я буду искать.

Ответы [ 2 ]

12 голосов
/ 20 марта 2012

Это сильно зависит от вашего компилятора, вашей конкретной иерархии классов, аппаратного обеспечения, всевозможных факторов.Вам действительно нужно измерить его непосредственно внутри вашего конкретного приложения .Вы можете использовать rdtsc или (в Windows) QueryPerformanceCounter , чтобы получить относительно высокоточный таймер для этой цели.Убедитесь, что время цикла или салазки составляет несколько тысяч dynamic_cast <> s, потому что даже QPC имеет разрешение только в ¼μs.

В нашем приложении dynamic_cast <> стоит около 1 микросекунды, а сравнение строк - около 3 нс / символ.

Оба параметра dynamic_cast <> и stricmp () находятся в верхней части наших профилей, что означает, что затраты на их использование для производительности значительны.(Честно говоря, в нашей работе недопустимо, чтобы эти функции находились в самом верху профиля, и мне пришлось переписать кучу чужого кода, который их использует.)

6 голосов
/ 20 марта 2012

Лучший ответ - измерить, я думаю, что dynamic_cast быстрее, чем сравнение любых, кроме самых коротких строк (или, возможно, даже коротких строк).

При этом попытка определить тип объекта обычно является признаком плохого замысла, согласно принципу подстановки Лискова вы должны просто обращаться с объектом так же, и виртуальные функции ведут себя правильно путь без осмотра типа снаружи.


Редактировать: После перечитывания вашего вопроса я остановлюсь на Нет подкласса, который я буду искать. В этом случае вы можете использовать typeid напрямую, я считаю, что это должно быть быстрее, чем любой из ваших вариантов (хотя поиск определенного типа все еще запах кода на мой взгляд)

#include <iostream>
#include <typeinfo>

struct top {
    virtual ~top() {} 
};

struct left : top { };
struct right : top { };

int main()
{
    left lft;
    top &tp = lft;   
    std::cout << std::boolalpha << (typeid(lft) == typeid(left)) << std::endl; 
    std::cout << std::boolalpha << (typeid(tp) == typeid(left)) << std::endl; 
    std::cout << std::boolalpha << (typeid(tp) == typeid(right)) << std::endl; 
}

Выход:

правда
правда
false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...