首页 > 解决方案 > boost::get() 与 boost::apply_visitor 性能比较

问题描述

我正在使用boost::variant并想知道从变体中提取值的更好(就性能而言)方法。

根据我的性能基准,在样本数据上,我发现申请访问者更快,但我没有在互联网上找到任何文档,这证实了这一点。

此外,调试/分析get()apply_visitor工作流程并不能说明为什么后者比前者更快。

任何可以评论这种行为或证明结果合理的人。

只有当它比 get 更快时,我才会更喜欢使用 apply_visitor。

PS从变体中获取值时,这不是boost::get vs boost::apply_visitor的重复

这是我的代码示例:

struct A
{
   .....
};

struct B
{
   .....
};

boost::variant<A, B> myVar;

我能够获取AB使用以下任一方式的值:

使用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 更快。

我有用户定义类型的变体,因此对它的性能特别感兴趣。

标签: c++boostboost-variant

解决方案


推荐阅读