c++ - 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;
我能够获取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 更快。
我有用户定义类型的变体,因此对它的性能特别感兴趣。
解决方案
推荐阅读
- visual-studio-code - 尝试在 Visual Stidio 代码中运行(和调试)经典 ASP
- c# - 标头操作:Cookie Fortify
- python - 如何根据条件在熊猫中创建行
- javascript - 非空字符串 .charAt(0) 如何返回空字符串?
- ruby-on-rails - 如何在 Rails Gemfile 中指定间接 gem 依赖版本
- php - 不能对 Ajax 使用 POST 方法,不能通过 dd() 获取值;使用 GET 方法后在控制器中,无法将记录添加到数据库
- activemq-artemis - 当消息被转发到没有队列的地址时,是否应该自动创建队列?
- amazon-web-services - Heroku - AWS Cloudfront
- html -
在 FormattedMessage 中用作值(使用 TypeScript ) - javascript - GSAP ScrollTrigger 动画淡入淡出不透明度问题