boost :: get()与boost :: apply_visitor性能比较

时间:2019-01-07 06:38:53

标签: c++ boost boost-variant

我正在使用boost::variant,想知道哪种方法(从性能方面)是从变体中提取值的更好方法。

使用性能基准,通过示例数据,我发现应用访问者的速度更快,但是我没有在互联网上找到任何文档,这证实了这一点。

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

任何人都可以对此行为发表评论或证明结果合理。

  

我只想使用apply_visitor,前提是它比   得到。

P.S。这不是boost::get vs boost::apply_visitor when fetching values from a variant

的副本

这是我的示例代码:

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>的变体,获取速度更快。

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

0 个答案:

没有答案