Re[22]: КЫВТ GUI—надо быть проще
От: Evgeny.Panasyuk Россия  
Дата: 19.05.12 11:28
Оценка: 15 (3)
Здравствуйте, Vamp, Вы писали:

V>Вот мне правда интересно, кто-то мерил сколько реально стоит виртуальный вызов в современных средах по сравнению с вызовом невиртуальным? В микросекундах? Я вот почему-то думаю, что виртуальный дороже невиртуального меньше чем на 10 микросекунд. Есть другие данные?


Я делал.
Виртуальные вызовы определённо медленней чем обычные, особенно учитывая тот факт, что обычные вызовы могут инлайнится.
Но, когда необходимо делать некоторый runtime выбор с помощью virtual, не честно просто сравнивать обычные вызовы с virtual. В таких сравнениях обычным вызовам должен предшествовать некоторый runtime выбор: if, switch, и т.п.

Код теста: http://ideone.com/Tjzne
Я сравниваю несколько случаев, которые зависят от параметра "Types count":

* virtual func — "Type count" определяет количество derived классов. Сложность O(1).
* switch — "Type count" определяет количество веток case. Сложность в моём случае is O(1) (я проверял ассемблерный код, но это может зависеть от компилятора).
* if-else O(N) — "Type count" определяет количество веток. if-else здесь в виде цепочки, что приводит к сложности O(N).
* if-else O(log(N)) — "Type count" определяет количество веток. if-else рекурсивно вложены, формируя двоичный поиск со сложностью O(ln(n)).
* static polymorphism — "Type count" определяет количество классов policy/strategy. Порядок вызовов жёстко задан, что приводит к сложности O(1). Здесь фактически не используется runtime выбор, но всё же это очень показательно в плане того, что может случится с inlined вызовами.

http://img856.imageshack.us/img856/6497/resultx64multipleseries.png
Результаты(для больших значений "Types count"):
static polymorphism < switch ~ virtual func < if-else O(log(N)) < if-else O(N)

Необходимо отметить, что в этих тестах вычисления настолько простые, что в случае static polymorphism они свёрнуты (после inlining) что привело к обратной зависимости времени на один вызов от "Type count".

Виртуальные вызовы в этом тесте сравнимы с главной альтернативой — switch.
Но, необходимо делать правильные выводы из результатов.
Например, используются циклы, поэтому vtables были в кэше. Но для очень random'ного execution path это не всегда верно. Также, варьируя количество параметров функций, можно получить другие результаты.
Также, вы можете получить совершенно другие результаты на другой платформе/компиляторе/настройках и т.п.

V>Вот мне правда интересно, кто-то мерил сколько реально стоит виртуальный вызов в современных средах по сравнению с вызовом невиртуальным? В микросекундах? Я вот почему-то думаю, что виртуальный дороже невиртуального меньше чем на 10 микросекунд. Есть другие данные?


Если всё таки интересно "голое" сравнение virtual и обычного вызова, смотрите на графике результаты для "Types count"=1
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.