Я использую 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 был быстрее.
У меня есть вариант пользовательских типов, поэтому я особенно заинтересован в его производительности.