说明
这是一个小实验。
定义一个复杂类
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,插入、查找