|
|
@ -1,108 +0,0 @@ |
|
|
|
#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(); |
|
|
|
} |