From 8df4ec46cb52fc63761ce9bad4a4d38f178f14af Mon Sep 17 00:00:00 2001 From: xxy <3237539022@qq.com> Date: Sun, 1 Dec 2024 09:21:42 +0800 Subject: [PATCH] benchmark --- CMakeLists.txt | 6 ++- test/benchmark_4leveldb.cpp | 108 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 test/benchmark_4leveldb.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ec151f8..019814b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -520,4 +520,8 @@ endif(LEVELDB_INSTALL) add_executable(db_test1 "${PROJECT_SOURCE_DIR}/test/test.cpp" ) -target_link_libraries(db_test1 PRIVATE leveldb gtest) \ No newline at end of file +target_link_libraries(db_test1 PRIVATE leveldb gtest) +add_executable(db_test2 +"${PROJECT_SOURCE_DIR}/test/benchmark_4leveldb.cpp" + ) +target_link_libraries(db_test2 PRIVATE leveldb gtest) \ No newline at end of file diff --git a/test/benchmark_4leveldb.cpp b/test/benchmark_4leveldb.cpp new file mode 100644 index 0000000..da83ab5 --- /dev/null +++ b/test/benchmark_4leveldb.cpp @@ -0,0 +1,108 @@ +#include +#include +#include +#include + +#include "leveldb/db.h" + +#define TEST_FREQUENCY (10000) + +char* randomstr() +{ + static char buf[1024]; + int len = rand() % 768 + 255; + for (int i = 0; i < len; ++i) { + buf[i] = 'A' + rand() % 26; + } + buf[len] = '\0'; + return buf; +} + +int main() +{ + leveldb::DB* db; + leveldb::Options options; + options.create_if_missing = true; + + // 打开数据库 + leveldb::Status status = leveldb::DB::Open(options, "./testdb", &db); + assert(status.ok()); + + srand(2017); + std::string k[TEST_FREQUENCY]; + for (int i = 0; i < TEST_FREQUENCY; ++i) { + k[i] = (randomstr()); + } + std::string v("壹贰叁肆伍陆柒捌玖拾"); + v.append(v).append(v).append(v).append(v).append(v); + + // 测试添加 + { + auto start = std::chrono::system_clock::now(); + for (int i = 0; i < TEST_FREQUENCY; ++i) { + status = db->Put(leveldb::WriteOptions(), k[i], v); + assert(status.ok()); + } + auto end = std::chrono::system_clock::now(); + auto duration = std::chrono::duration_cast(end - start); + + std::cout << TEST_FREQUENCY <<"次添加耗时: " + << double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den + << "秒" << std::endl; + } + // 测试获取 + { + auto start = std::chrono::system_clock::now(); + std::string v2[TEST_FREQUENCY]; + for (int i = 0; i < TEST_FREQUENCY; ++i) { + status = db->Get(leveldb::ReadOptions(), k[i], &v2[i]); + assert(status.ok()); + } + auto end = std::chrono::system_clock::now(); + auto duration = std::chrono::duration_cast(end - start); + + std::cout << TEST_FREQUENCY <<"次获取耗时: " + << double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den + << "秒" << std::endl; + // 验证获取结果是否正确 + std::string ss; + for (int i = 0; i < TEST_FREQUENCY; ++i) { + if (v2[i] != v) { + std::cout << "第 " << i << " 个结果不正确" << std::endl; + std::cout << v2[i] << std::endl; + } + } + } + // 测试修改 + { + auto start = std::chrono::system_clock::now(); + v.append(v); + for (int i = 0; i < TEST_FREQUENCY; ++i) { + status = db->Put(leveldb::WriteOptions(), k[i], v); + assert(status.ok()); + } + auto end = std::chrono::system_clock::now(); + auto duration = std::chrono::duration_cast(end - start); + + std::cout << TEST_FREQUENCY <<"次修改耗时: " + << double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den + << "秒" << std::endl; + } + + // 测试删除 + { + auto start = std::chrono::system_clock::now(); + for (int i = 0; i < TEST_FREQUENCY; ++i) { + status = db->Delete(leveldb::WriteOptions(), k[i]); + assert(status.ok()); + } + auto end = std::chrono::system_clock::now(); + auto duration = std::chrono::duration_cast(end - start); + + std::cout << TEST_FREQUENCY <<"次删除耗时: " + << double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den + << "秒" << std::endl; + } + delete db; + return 0; +} \ No newline at end of file