|
|
- #include "gtest/gtest.h"
- #include "db/NewDB.h" // NewDB 的头文件
- #include "leveldb/env.h"
- #include "leveldb/db.h"
- #include <chrono> // 用于计时
- #include <random> // 用于生成随机数
- #include <vector> // 用于存储延迟
-
- using namespace std;
- using namespace leveldb;
-
- // 随机生成字符串的辅助函数
- std::string GenerateRandomString(size_t length) {
- const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- const size_t max_index = sizeof(charset) - 1;
- std::random_device rd;
- std::mt19937 generator(rd());
- std::uniform_int_distribution<size_t> distribution(0, max_index);
-
- std::string random_str;
- for (size_t i = 0; i < length; ++i) {
- random_str += charset[distribution(generator)];
- }
- return random_str;
- }
-
- // 打开数据库的辅助函数
- Status OpenDB(std::string dbName, NewDB** db) {
- Options options;
- options.create_if_missing = true;
- Status s = NewDB::Open(options, dbName, db);
- if (!s.ok()) {
- cerr << "Error opening database: " << s.ToString() << endl;
- }
- return s;
- }
-
- std::string testdbname = "testdb_for_performance";
-
- // 延迟单条指令测试
- void TestLatency(int num_operations, std::vector<int64_t>& lat_res) {
- int64_t latency = 0;
- auto end_time = std::chrono::steady_clock::now();
- auto last_time = end_time;
-
- for (int i = 0; i < num_operations; ++i) {
- // 记录操作的延迟
- end_time = std::chrono::steady_clock::now();
- latency = std::chrono::duration_cast<std::chrono::milliseconds>(
- end_time - last_time).count();
- last_time = end_time;
-
- lat_res.emplace_back(latency);
- }
- }
-
- // 吞吐量测试
- TEST(TestNewDB, PutFieldsThroughputTest) {
- // 创建 NewDB 实例
- NewDB* db;
- ASSERT_TRUE(OpenDB(testdbname, &db).ok());
-
- // 插入索引字段
- db->CreateIndexOnField("address");
-
- // 延迟测试
- vector<int64_t> latencies; // 存储每次插入的延迟
-
- int num_inserts = 100000; // 插入的条数
-
- // 测试插入吞吐量
- auto start_time = std::chrono::high_resolution_clock::now(); // 记录开始时间
- for (int i = 0; i < num_inserts; ++i) {
- std::string key = "k_" + std::to_string(i);
-
- // 随机生成字段内容
- FieldArray fields = {
- {"name", "Customer#" + std::to_string(i)},
- {"address", GenerateRandomString(10)}, // 随机生成地址
- {"phone", GenerateRandomString(12)} // 随机生成电话号码
- };
-
- db->Put_fields(WriteOptions(), key, fields);
- }
-
- // 延迟测试
- TestLatency(num_inserts, latencies);
-
- auto end_time = std::chrono::high_resolution_clock::now(); // 记录结束时间
- auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
-
- // 计算吞吐量并输出
- cout << "Throughput: " << num_inserts * 1000 / duration << " OPS" << endl;
-
- // 输出延迟
- // for (size_t i = 0; i < latencies.size(); ++i) {
- // cout << "Latency for operation " << i + 1 << ": " << latencies[i] << " ms" << endl;
- // }
- cout << "Total Latency " << duration << " ms" << endl;
- // 清理数据库
- delete db;
- }
-
- // 主函数运行所有测试
- int main(int argc, char** argv) {
- testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
- }
|