C ++ - повысить получить вопрос - PullRequest
7 голосов
/ 22 октября 2010

Кто-нибудь знает, является ли boost::get для boost::variant ресурсоемкой операцией или нет.

В настоящий момент я выполняю рефакторинг некоторого старого кода в критической для производительности части , где "вариантирование" реализовывалось контейнерами для каждого возможного типа и соответствовало enum.

Очевидно, что это быстро, но уродливо и сейчас, когда мне нужно реорганизовать код, чтобы он работал с еще одним типом , я хочу избавиться от этой старой части кода и заменить это с boost::variant.

Кроме того, я не могу просто «профилировать оба варианта и сравнивать», потому что этот рефакторинг - боль в заднице и отнимает много времени.

Итак, если кто-то знает, как boost::get<x> выполняет сравнение с диспетчеризацией общего типа enum-based, я был бы признателен, если бы вы поделились этими знаниями.

Существует еще один вариант использования boost::variant<types> с пользовательским посетителем (как описано в boost::variant документации) - может ли это быть быстрее, чем boost::get в моем случае?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 22 октября 2010

Вы все еще можете написать простое тестовое приложение, чтобы сравнить их, это не обязательно должна быть производственная среда.

У моего коллеги недавно была проблема, аналогичная этой.В его сценарии были объекты разных типов, но он всегда знал заранее, какой тип он ожидал.Кроме того, его структура данных была огромной, поэтому проблема с памятью.Он решил проблему с помощью void * и reinterpret_cast.Это предотвращает использование памяти полиморфизма и очень быстро.Вы должны быть абсолютно уверены в том, что делаете, иначе все взорвется.

3 голосов
/ 22 октября 2010

Глядя на код, get<> реализован с использованием механизма внутреннего посетителя boost::variant. В свою очередь, механизм посетителей опирается на mpl последовательностей и выполняется шаг за шагом. Это означает, что самое большее n шагов для варианта типа n , но цикл (рекурсивный вызов) существует. Опять же, как предлагает Space Cowboy, полезен небольшой тест производительности.

...