Использование виртуальных функций вместо операторов IF быстрее? - PullRequest
7 голосов
/ 15 января 2012

Я помню, как читал где-то в Интернете, что в ЧРЕЗВЫЧАЙНЫХ ситуациях с низкой задержкой лучше использовать виртуальные функции вместо операторов IF.

Это правда?Они в основном говорят, что динамический полиморфизм лучше для скоростных ситуаций?

Есть ли у пользователей какие-либо другие "причуды" C ++ с низкой задержкой, которыми они могли бы поделиться?

1 Ответ

8 голосов
/ 15 января 2012

Я очень сомневаюсь, что один оператор if / else будет медленнее, чем использование виртуальной функции: виртуальная функция обычно обеспечивает останов конвейера и ограничивает возможности оптимизации. Оператор if может остановить конвейер, но если он часто выполняется, прогноз может пойти правильным путем. Однако, если ваша альтернатива находится между каскадом нескольких операторов if / else и одним вызовом виртуальной функции, то последний может быть быстрее. Кроме того, если общий код, выполняемый с использованием виртуальных функций по сравнению с ветвями, различается, функции становятся существенно меньше, что может привести к небольшим потерям кеша в кеше команд. То есть это зависит от ситуации. Лучший способ - это измерить. Обратите внимание, что измерение искусственного кода, который просто пытается исследовать разницу между двумя подходами, но на самом деле не выполняет никакой обработки, дает неверные результаты. Однако, когда вам нужно создать код с очень низкой задержкой, вы, как правило, можете потратить больше времени на его разработку, т. Е. Эксперименты с несколькими различными подходами могут быть жизнеспособными.

Хотя мои коллеги, как правило, не одобряют мои подходы к шаблонам, чтобы избежать ветвления во время выполнения, код, с которым я сталкиваюсь, часто очень медленно компилируется, но работает очень быстро. Конечно, это зависит от функций или ветвей, которые будут известны во время компиляции. В областях, которые я использовал, например, для обработки сообщений часто бывает достаточно иметь одно динамическое решение, например, по одному на каждое сообщение (то есть один вызов виртуальной функции), за которым следует обработка, в которой не используются динамические типы (это все еще условные выражения, например, для количества значений в таблице).

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