Browse Source

测试查找

LinTianxiang 10 months ago
parent
commit
e0d38619d2
3 changed files with 149 additions and 43 deletions
  1. 25 38
      analysis1.cpp
  2. 119 0
      analysis2.cpp
  3. 5 5
      tire.cpp

+ 25 - 38
analysis.cpp → analysis1.cpp

@@ -56,8 +56,12 @@ void print_times(string name, vector<long long>& nums) {
 
 int main() {
 	const int N = 1e6;
+	const int M1 = 3;
+	const int M2 = 5;
+
 	Tire<Test> tire;
 	unordered_map<string, Test> umap;
+
 	for (int i = 0; i < N; ++i) {
 		Test test;
 		test.num = i + 1;
@@ -70,51 +74,34 @@ int main() {
 		test.str = to_string(i + 1);
 		umap.insert({ test.str, test });
 	};
-	// group 1
-	umap_test(umap);
-	tire_test(tire);
-
-	umap_test(umap);
-	tire_test(tire);
 
-	umap_test(umap);
-	tire_test(tire);
+	// group 1
+	for (int i = 0; i < M1; ++i) {
+		umap_test(umap);
+		tire_test(tire);
+	}
 
 	// group 2
-	tire_test(tire);
-	umap_test(umap);
-
-	tire_test(tire);
-	umap_test(umap);
-
-	tire_test(tire);
-	umap_test(umap);
+	for (int i = 0; i < M1; ++i) {
+		tire_test(tire);
+		umap_test(umap);
+	}
 
 	// group 3
-	umap_test(umap);
-	umap_test(umap);
-	umap_test(umap);
-	umap_test(umap);
-	umap_test(umap);
-
-	tire_test(tire);
-	tire_test(tire);
-	tire_test(tire);
-	tire_test(tire);
-	tire_test(tire);
+	for (int i = 0; i < M2; ++i) {
+		umap_test(umap);
+	}
+	for (int i = 0; i < M2; ++i) {
+		tire_test(tire);
+	}
 
 	// group 4
-	tire_test(tire);
-	tire_test(tire);
-	tire_test(tire);
-	tire_test(tire);
-	tire_test(tire);
-
-	umap_test(umap);
-	umap_test(umap);
-	umap_test(umap);
-	umap_test(umap);
-	umap_test(umap);
+	for (int i = 0; i < M2; ++i) {
+		tire_test(tire);
+	}
+	for (int i = 0; i < M2; ++i) {
+		umap_test(umap);
+	}
 
 	// 分析
 	print_times("umap", umap_times);

+ 119 - 0
analysis2.cpp

@@ -0,0 +1,119 @@
+#include <iostream>
+#include <string>
+#include <vector>
+#include <unordered_map>
+#include <chrono>
+using namespace std;
+
+#include "tire.h"
+#include "tire.cpp"
+
+struct Test {
+	int num;
+	string str;
+};
+
+vector<long long> umap_times;
+vector<long long> tire_times;
+
+const string table[16] = { "12345", "99999", "97282", "1", "2","3","7", "2222", "22", "3422", "7482", "9374", "000" };
+void umap_test(unordered_map<string, Test>& umap) {
+	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]);
+		}
+	}
+	auto end = chrono::high_resolution_clock::now();
+	auto duration = chrono::duration_cast<chrono::microseconds>(end - start);
+	umap_times.push_back(duration.count());
+}
+
+void tire_test(Tire<Test>& tire) {
+	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]);
+		}
+	}
+	auto end = chrono::high_resolution_clock::now();
+	auto duration = chrono::duration_cast<chrono::microseconds>(end - start);
+	tire_times.push_back(duration.count());
+}
+
+void analysis(string name, vector<long long>& nums) {
+	const int n = nums.size();
+	long long maxn = LLONG_MIN, minn = LLONG_MAX;
+	long long sum = 0;
+	for (long long& num : nums) {
+		maxn = max(maxn, num);
+		minn = min(minn, num);
+		sum += num;
+	}
+	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() {
+	const int N = 1e6;
+	const int M1 = 3;
+	const int M2 = 5;
+
+	Tire<Test> tire;
+	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 });
+	};
+
+	// group 1
+	for (int i = 0; i < M1; ++i) {
+		umap_test(umap);
+		tire_test(tire);
+	}
+
+	// group 2
+	for (int i = 0; i < M1; ++i) {
+		tire_test(tire);
+		umap_test(umap);
+	}
+
+	// group 3
+	for (int i = 0; i < M2; ++i) {
+		umap_test(umap);
+	}
+	for (int i = 0; i < M2; ++i) {
+		tire_test(tire);
+	}
+
+	// group 4
+	for (int i = 0; i < M2; ++i) {
+		tire_test(tire);
+	}
+	for (int i = 0; i < M2; ++i) {
+		umap_test(umap);
+	}
+
+	// 分析
+	print_times("umap", umap_times);
+	print_times("tire", tire_times);
+	analysis("umap", umap_times);
+	analysis("tire", tire_times);
+	return 0;
+}

+ 5 - 5
tire.cpp

@@ -26,14 +26,14 @@ TEMPLATE(HOLDER) ADT::Tire() {
 TEMPLATE(typename ITERATOR) ADT::find(const std::string& key) {
 	Node* curr = &_root;
 	Node* next = nullptr;
-	for (char ch : key) {
-		next = curr[ch];
+	for (const char& ch : key) {
+		next = curr->_next[(const int)ch];
 		if (next == nullptr) {
-
+			return end();
 		}
 		curr = next;
 	}
-	return curr->is_word() ? curr : nullptr;
+	return curr->_value == nullptr ? end() : iterator(curr->_value);
 }
 
 TEMPLATE(Type&) ADT::operator[](const std::string& key) {
@@ -44,7 +44,7 @@ TEMPLATE(typename ITERATOR) ADT::insert(const std::string& key, Type& value) {
 	Node* curr = &_root;
 	Node* next = nullptr;
 	for (const char& ch : key) {
-		next = curr->_next[(int)ch];
+		next = curr->_next[(const int)ch];
 		if (next != nullptr) {
 			curr = next;
 			continue;