|
@@ -3,29 +3,42 @@
|
|
#include <vector>
|
|
#include <vector>
|
|
#include <unordered_map>
|
|
#include <unordered_map>
|
|
#include <chrono>
|
|
#include <chrono>
|
|
|
|
+#include <random>
|
|
using namespace std;
|
|
using namespace std;
|
|
|
|
|
|
#include "tire.h"
|
|
#include "tire.h"
|
|
|
|
|
|
const int N = 1e5;
|
|
const int N = 1e5;
|
|
|
|
+const int M = 5e4;
|
|
const int M1 = 3;
|
|
const int M1 = 3;
|
|
const int M2 = 5;
|
|
const int M2 = 5;
|
|
|
|
|
|
struct Test {
|
|
struct Test {
|
|
- int num;
|
|
|
|
- string str;
|
|
|
|
|
|
+ int a;
|
|
|
|
+ short b;
|
|
|
|
+ int c;
|
|
};
|
|
};
|
|
|
|
|
|
vector<long long> umap_times;
|
|
vector<long long> umap_times;
|
|
vector<long long> tire_times;
|
|
vector<long long> tire_times;
|
|
|
|
|
|
-const string table[16] = { "12345", "99999", "97282", "1", "2","3","7", "2222", "22", "3422", "7482", "9374", "000" };
|
|
|
|
|
|
+vector<string> data_table;
|
|
|
|
+void init_data_table() {
|
|
|
|
+ for (int i = 0; i < N; ++i) {
|
|
|
|
+ char str[32] = "";
|
|
|
|
+ int size = rand() % 30;
|
|
|
|
+ for (int j = 0; j < size; ++j) {
|
|
|
|
+ str[j] = (char)(rand() % 256);
|
|
|
|
+ }
|
|
|
|
+ str[size] = '\0';
|
|
|
|
+ data_table.push_back(str);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void umap_test(unordered_map<string, Test>& umap) {
|
|
void umap_test(unordered_map<string, Test>& umap) {
|
|
auto start = chrono::high_resolution_clock::now();
|
|
auto start = chrono::high_resolution_clock::now();
|
|
- for (int j = 0; j < 1e4; ++j) {
|
|
|
|
- for (int i = 0; i < 16; ++i) {
|
|
|
|
- umap.find(table[i]);
|
|
|
|
- }
|
|
|
|
|
|
+ for (auto& item : umap) {
|
|
|
|
+
|
|
}
|
|
}
|
|
auto end = chrono::high_resolution_clock::now();
|
|
auto end = chrono::high_resolution_clock::now();
|
|
auto duration = chrono::duration_cast<chrono::microseconds>(end - start);
|
|
auto duration = chrono::duration_cast<chrono::microseconds>(end - start);
|
|
@@ -34,10 +47,8 @@ void umap_test(unordered_map<string, Test>& umap) {
|
|
|
|
|
|
void tire_test(Tire<Test>& tire) {
|
|
void tire_test(Tire<Test>& tire) {
|
|
auto start = chrono::high_resolution_clock::now();
|
|
auto start = chrono::high_resolution_clock::now();
|
|
- for (int j = 0; j < 1e4; ++j) {
|
|
|
|
- for (int i = 0; i < 16; ++i) {
|
|
|
|
- tire.find(table[i]);
|
|
|
|
- }
|
|
|
|
|
|
+ for (auto& item : tire) {
|
|
|
|
+
|
|
}
|
|
}
|
|
auto end = chrono::high_resolution_clock::now();
|
|
auto end = chrono::high_resolution_clock::now();
|
|
auto duration = chrono::duration_cast<chrono::microseconds>(end - start);
|
|
auto duration = chrono::duration_cast<chrono::microseconds>(end - start);
|
|
@@ -56,30 +67,25 @@ void analysis(string name, vector<long long>& nums) {
|
|
cout << name << ": " << "maxn: " << maxn << "ms " << "minn: " << minn << "ms " << "avg: " << (1.0 * sum / n) << "ms " << "sum: " << sum << "ms " << endl;
|
|
cout << name << ": " << "maxn: " << maxn << "ms " << "minn: " << minn << "ms " << "avg: " << (1.0 * sum / n) << "ms " << "sum: " << sum << "ms " << endl;
|
|
}
|
|
}
|
|
|
|
|
|
-void print_times(string name, vector<long long>& nums) {
|
|
|
|
- cout << name << endl;
|
|
|
|
- for (long long& num : nums) {
|
|
|
|
- cout << num << " ";
|
|
|
|
- };
|
|
|
|
- cout << endl;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
int main() {
|
|
int main() {
|
|
|
|
+ init_data_table();
|
|
|
|
+
|
|
Tire<Test> tire;
|
|
Tire<Test> tire;
|
|
unordered_map<string, Test> umap;
|
|
unordered_map<string, Test> umap;
|
|
|
|
|
|
- for (int i = 0; i < N; ++i) {
|
|
|
|
- Test test;
|
|
|
|
- test.num = i + 1;
|
|
|
|
- test.str = to_string(i + 1);
|
|
|
|
- tire.insert(test.str, test);
|
|
|
|
- };
|
|
|
|
- for (int i = 0; i < N; ++i) {
|
|
|
|
- Test test;
|
|
|
|
- test.num = i + 1;
|
|
|
|
- test.str = to_string(i + 1);
|
|
|
|
- umap.insert({ test.str, test });
|
|
|
|
- };
|
|
|
|
|
|
+ const int n = data_table.size();
|
|
|
|
+ for (int i = 0; i < n; ++i) {
|
|
|
|
+ Test t;
|
|
|
|
+ t.a = i;
|
|
|
|
+ t.c = n + i;
|
|
|
|
+ tire.insert(data_table[i], t);
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < n; ++i) {
|
|
|
|
+ Test t;
|
|
|
|
+ t.a = i;
|
|
|
|
+ t.c = n + i;
|
|
|
|
+ umap.insert({ data_table[i], t });
|
|
|
|
+ }
|
|
|
|
|
|
// group 1
|
|
// group 1
|
|
for (int i = 0; i < M1; ++i) {
|
|
for (int i = 0; i < M1; ++i) {
|
|
@@ -110,8 +116,6 @@ int main() {
|
|
}
|
|
}
|
|
|
|
|
|
// 分析
|
|
// 分析
|
|
- print_times("umap", umap_times);
|
|
|
|
- print_times("tire", tire_times);
|
|
|
|
analysis("umap", umap_times);
|
|
analysis("umap", umap_times);
|
|
analysis("tire", tire_times);
|
|
analysis("tire", tire_times);
|
|
return 0;
|
|
return 0;
|