Сравнение производительности boost :: get () и boost :: apply_visitor - PullRequest
0 голосов
/ 07 января 2019

Я использую boost::variant и хотел знать, какой из них лучше (с точки зрения производительности) для извлечения значений из варианта.

С моим тестом производительности на примере данных я обнаружил, что применять посетителя быстрее, но я не нашел никакой документации в Интернете, которая подтверждает то же самое.

Кроме того, отладка / профилирование рабочего процесса get() и apply_visitor не указывает, почему последний работает быстрее первого.

Любой, кто может прокомментировать это поведение или обосновать результаты.

Я бы предпочел использовать apply_visitor, только если он быстрее, чем получить.

P.S. это не дубликат boost :: get vs boost :: apply_visitor при извлечении значений из варианта

Вот мой код с примером:

struct A
{
   .....
};

struct B
{
   .....
};

boost::variant<A, B> myVar;

Я могу получить значения A или B одним из следующих способов:

с использованием boost::get()

switch(myVar.which())
{
 case 0:
   auto a = boost::get<A>(myVar);
    break;
case 1: 
   auto b = boost::get<B>(myVar);
   break;
}

с использованием apply_visitor()

class visitorA : public static_visitor<std::optional<A>>
{
public:

        template <typename T>
        std::optional<A> operator() (const T &val) const
        {
            return std::optional<<A>>(nullopt);
        }

        std::optional<A> operator()(const A &val) const
        {
            return std::optional<A>(val);
        }
};

auto optA = apply_visitor(visitorA, myVar);
if(optA )
  auto a = optA.value();
auto optB = apply_visitor(visitorB, myVar);
if(optB)
  auto b = optB.value();

Для visitorB будет аналогичное определение для извлечения значений типа B (здесь я избегаю его, чтобы все было просто)

Результаты сравнения производительности, время (в микросекундах) :

Для 100000 итераций:

  • получите 336
  • применить 228

Для 1000000 итераций:

  • получить 3694
  • применить 2266

Примечание. Это время, когда вариант имеет пользовательские типы. Для варианта <int, std::string> get был быстрее.

У меня есть вариант пользовательских типов, поэтому я особенно заинтересован в его производительности.

...