说明
这是一个小实验。
定义一个复杂类
1  | struct Complex {  | 
性能对比
作为实验,我们把负载类的对象插入一个 Map。在开始性能对比之前,定义计算时间的工具函数。
1  | std::chrono::time_point<std::chrono::system_clock> now() {  | 
std::map
1  | template<typename K, typename V>  | 
输出
1  | elapsed: 7750  | 
std::unordered_map
1  | template<typename K, typename V>  | 
输出
1  | elapsed: 4474  | 
std::shared_ptr
如果我们改为使用共享指针。
1  | template<typename K, typename V>  | 
输出
1  | elapsed: 2002  | 
简单对象
再来对比下指针和简单对象。
智能指针
1  | template<typename K, typename V>  | 
输出
1  | elapsed: 2012  | 
简单对象
1  | template<typename K, typename V>  | 
输出
1  | elapsed: 1763  | 
std::move
std::move 实际会调用 move constructor(A(A &&another)),所以,对于基础类型和没有实现 move constructor 的类不起效果。
定义 A。
1  | class A {  | 
看下插入 map。
1  | std::map<int, A> ma;  | 
用如下方式。
1  | std::map<int, A> ma;  | 
实现移动构造。
1  | class A {  | 
申请内存
先来看下空转。
1  | int loop = 1000 * 10000;  | 
再来看下申请内存。
1  | int loop = 1000 * 10000;  | 
再来看下插入 vector。
1  | int loop = 1000 * 10000;  | 
再看下 reserve size。
1  | int loop = 1000 * 10000;  | 
再看下通过构造函数初始化列表。
1  | int loop = 1000 * 10000;  | 
再来看下 resize。
1  | int loop = 1000 * 10000;  | 
小结
在深度理解程序的过程中,很多操作的实际成本和我们想象中的不太一样,用一句话直白的说明就是,“这个操作竟然这么耗时?”,或者,“这个操作这么快?”。
操作
- 计算
 - 内存申请
 - 容器
- map,插入、查找