【发布时间】:2014-07-20 05:38:52
【问题描述】:
我最近开始在一些项目中使用 c++11,并且还开始大量使用我相对较新的 stl 容器。
我最近编写了一个函数,它的功能与此类似:
CMyClass* CreateAndOrGetClass( int _iObjectId, std::map<int, CMyClass*>& _mapObjectData )
{
CMyClass* pClassInstance{ nullptr };
try
{
pClassInstance = _mapObjectData.at( _iObjectId);
}
catch ( ... )
{
pClassInstance = new CMyClass();
__mapObjectData.insert( _iObjectId, pClassInstance );
}
return ( pClassInstance );
}
我的问题是关于在明显不是“异常”的情况下使用异常。这似乎是实现手头目的的一种非常简洁的方式,而不是涉及设置迭代器。
有没有我可能遗漏的关于将异常用于此类目的的任何陷阱?
测量*
因此,为了跟进,我做了一些性能测试,将基于异常的代码与所选答案中的代码示例进行比较。这是一个很好的练习,可以通过使用正常代码流的异常来验证性能不佳的建议。它还提供了一些很好的参考资料,用于断言在不引发异常时接近零性能损失。
虽然这些测试并不详尽,但以下是我观察到的:
每个测试都使用 rand() 作为映射键的源(生成最多 32768 个元素)对大量插入/提取运行:
异常方法:平均 5.99 秒
查找/添加方法:平均 0.75 秒
将随机元素的范围扩大十倍会返回这些数字:
异常方法:平均 56.7 秒
查找/添加方法:平均 4.54 秒
然后我用所有可能的键条目预先填充了地图,这样尝试就不会抛出:
异常方法:平均 0.162 秒
查找/添加方法:平均 0.158 秒
奇怪的是,使用 MS VStudio,调试模式代码使用异常处理方法更快。
【问题讨论】:
-
你的代码会更慢,更难调试,当然也更难读。
标签: c++ exception c++11 map stl