-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_performance.cpp
More file actions
151 lines (134 loc) · 4.22 KB
/
Copy pathtest_performance.cpp
File metadata and controls
151 lines (134 loc) · 4.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <iostream>
#include <map>
#include <vector>
#include <set>
#include <chrono>
#include <random>
#include "mSkipList.hpp"
using namespace std;
using namespace msl;
using namespace std::chrono;
// 防优化累加器
volatile size_t g_dummy = 0;
template<typename Func>
auto bench(Func&& f) -> long long {
auto s = high_resolution_clock::now();
f();
auto e = high_resolution_clock::now();
return duration_cast<milliseconds>(e - s).count();
}
int main() {
auto rd = random_device();
auto m = mt19937(rd());
size_t random_max = 500000;
auto r = uniform_int_distribution<>(1, random_max);
size_t max = 1000000;
vector<size_t> v;
set<size_t> s;
for (size_t i = 0; i < max; i++) {
size_t si = r(m);
v.push_back(si);
s.insert(si);
}
// ========== 随机测试 ==========
cout << "随机插查" << max << "条1~" << random_max << endl;
// 1. map 插入
auto m_map = map<size_t, size_t>{};
cout << "map插入:" << bench([&]() {
for (size_t i = 0; i < v.size(); i++) {
m_map.insert({v[i], v[i]});
}
}) << "ms" << endl;
// 2. map 查找(在已填充的 map 上,用 find + 防优化)
cout << "map查找:" << bench([&]() {
size_t acc = 0;
for (size_t i = 0; i < v.size(); i++) {
auto it = m_map.find(v[i]);
if (it != m_map.end()) acc += it->second;
}
g_dummy = acc; // 强制写出,防止优化
}) << "ms" << endl;
// 3. map 删除(基于 set 的 key 序列,返回值累加防优化)
size_t map_erase_cnt = 0;
cout << "map删除:" << bench([&]() {
size_t cnt = 0;
for (auto it = s.begin(); it != s.end(); ++it) {
cnt += m_map.erase(*it);
}
map_erase_cnt = cnt;
g_dummy = cnt;
}) << "ms" << endl;
// 4. 跳表插入
auto m_sl = mSkipList<0, size_t, size_t>(4096, 3, -1, 0, 0);
cout << "mSkipList插入:" << bench([&]() {
for (size_t i = 0; i < v.size(); i++) {
m_sl.insert(v[i], v[i]);
}
}) << "ms" << endl;
// 5. 跳表查找
cout << "mSkipList查找:" << bench([&]() {
size_t acc = 0;
for (size_t i = 0; i < v.size(); i++) {
acc += m_sl.get<size_t>(v[i], 0);
}
g_dummy = acc;
}) << "ms" << endl;
// 6. 跳表删除
cout << "mSkipList删除:" << bench([&]() {
for (auto it = s.begin(); it != s.end(); ++it) {
m_sl.erase(*it);
}
}) << "ms" << endl;
// ========== 顺序测试 ==========
cout << "\n顺序插查" << max << "条" << endl;
{
// 1. map 顺序插入
m_map = map<size_t, size_t>{};
cout << "map插入:" << bench([&]() {
for (size_t i = 0; i < max; i++) {
m_map.insert({i, i});
}
}) << "ms" << endl;
// 2. map 顺序查找(在已填充的 map 上)
cout << "map查找:" << bench([&]() {
size_t acc = 0;
for (size_t i = 0; i < max; i++) {
auto it = m_map.find(i);
if (it != m_map.end()) acc += it->second;
}
g_dummy = acc;
}) << "ms" << endl;
// 3. map 顺序删除
cout << "map删除:" << bench([&]() {
size_t cnt = 0;
for (size_t i = 0; i < max; i++) {
cnt += m_map.erase(i);
}
g_dummy = cnt;
}) << "ms" << endl;
}
{
// 4. 跳表顺序插入
auto m_sl = mSkipList<0, size_t, size_t>(4096, 3, -1, 0, 0);
cout << "mSkipList插入:" << bench([&]() {
for (size_t i = 0; i < max; i++) {
m_sl.insert(i, i);
}
}) << "ms" << endl;
// 5. 跳表顺序查找
cout << "mSkipList查找:" << bench([&]() {
size_t acc = 0;
for (size_t i = 0; i < max; i++) {
acc += m_sl.get<size_t>(i, 0);
}
g_dummy = acc;
}) << "ms" << endl;
// 6. 跳表顺序删除
cout << "mSkipList删除:" << bench([&]() {
for (size_t i = 0; i < max; i++) {
m_sl.erase(i);
}
}) << "ms" << endl;
}
return 0;
}