我正在使用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;
我可以使用以下两种方式之一来获取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>
的变体,获取速度更快。
我有用户定义类型的变体,因此对它的性能特别感兴趣。