这段代码是一个用于性能测试的头文件,它包含了两个宏定义 `FUN_TEST1` 和 `FUN_TEST2` 用于测量和打印函数执行时间,其中 `FUN_TEST1` 用于无额外参数的函数性能测试,而 `FUN_TEST2` 用于需要一个额外参数的函数测试。代码中定义了两个测试函数 `binary_search_test` 和 `sort_test`,分别用于比较标准库和自定义库中二分查找和排序算法的性能。性能测试的入口点是 `algorithm_performance_test` 函数,它在 `PERFORMANCE_TEST_ON` 宏被定义时执行。整个文件通过命名空间 `mystl::test::algorithm_performance_test` 组织,以防止命名冲突,并确保代码的整洁结构。

main
sunjiawei 8 months ago
parent 4ed9c7641c
commit 1ef64c15a4

@ -1,108 +1,105 @@
#ifndef MYTINYSTL_ALGORITHM_PERFORMANCE_TEST_H_
#ifndef MYTINYSTL_ALGORITHM_PERFORMANCE_TEST_H_ // 防止头文件被重复包含
#define MYTINYSTL_ALGORITHM_PERFORMANCE_TEST_H_
// 仅仅针对 sort, binary_search 做了性能测试
// 仅对 sort 和 binary_search 函数进行性能测试
#include <algorithm>
#include <algorithm> // 包含标准算法库
#include "../MyTinySTL/algorithm.h"
#include "test.h"
#include "../MyTinySTL/algorithm.h" // 包含自定义的算法库
#include "test.h" // 包含测试相关的头文件
namespace mystl
{
namespace test
{
namespace algorithm_performance_test
namespace mystl // 命名空间 mystl
{
namespace test // 命名空间 test
{
namespace algorithm_performance_test // 命名空间 algorithm_performance_test
// 函数性能测试宏定义
{
// 函数性能测试宏定义,用于测试函数 fun 并打印执行时间
#define FUN_TEST1(mode, fun, count) do { \
std::string fun_name = #fun; \
srand((int)time(0)); \
char buf[10]; \
clock_t start, end; \
int *arr = new int[count]; \
for(size_t i = 0; i < count; ++i) *(arr + i) = rand(); \
start = clock(); \
mode::fun(arr, arr + count); \
end = clock(); \
int n = static_cast<int>(static_cast<double>(end - start) \
/ CLOCKS_PER_SEC * 1000); \
std::snprintf(buf, sizeof(buf), "%d", n); \
std::string t = buf; \
t += "ms |"; \
std::cout << std::setw(WIDE) << t; \
delete []arr; \
std::string fun_name = #fun; // \
srand((int)time(0)); // \
char buf[10]; // \
clock_t start, end; // \
int *arr = new int[count]; // \
for(size_t i = 0; i < count; ++i) *(arr + i) = rand(); // \
start = clock(); // \
mode::fun(arr, arr + count); // fun \
end = clock(); // \
int n = static_cast<int>(static_cast<double>(end - start) // \
/ CLOCKS_PER_SEC * 1000); // \
std::snprintf(buf, sizeof(buf), "%d", n); // \
std::string t = buf; // t \
t += "ms |"; // \
std::cout << std::setw(WIDE) << t; // \
delete []arr; // \
} while(0)
#define FUN_TEST2(mode, fun, count) do { \
std::string fun_name = #fun; \
srand((int)time(0)); \
char buf[10]; \
clock_t start, end; \
int *arr = new int[count]; \
for(size_t i = 0; i < count; ++i) *(arr + i) = rand(); \
start = clock(); \
for(size_t i = 0; i < count; ++i) \
mode::fun(arr, arr + count, rand()); \
end = clock(); \
int n = static_cast<int>(static_cast<double>(end - start) \
/ CLOCKS_PER_SEC * 1000); \
std::snprintf(buf, sizeof(buf), "%d", n); \
std::string t = buf; \
t += "ms |"; \
std::cout << std::setw(WIDE) << t; \
delete []arr; \
} while(0)
#define FUN_TEST2(mode, fun, count) do { // 与 FUN_TEST1 类似,但适用于需要额外参数的函数
std::string fun_name = #fun; // \
srand((int)time(0)); // \
char buf[10]; // \
clock_t start, end; // \
int *arr = new int[count]; // \
for(size_t i = 0; i < count; ++i) *(arr + i) = rand(); // \
start = clock(); // \
for(size_t i = 0; i < count; ++i) \
mode::fun(arr, arr + count, rand()); // fun \
end = clock(); // \
int n = static_cast<int>(static_cast<double>(end - start) // \
/ CLOCKS_PER_SEC * 1000); // \
std::snprintf(buf, sizeof(buf), "%d", n); // \
std::string t = buf; // t \
t += "ms |"; // \
std::cout << std::setw(WIDE) << t; // \
delete []arr; // \
} while(0)
void binary_search_test()
{
std::cout << "[------------------- function : binary_search ------------------]" << std::endl;
std::cout << "| orders of magnitude |";
TEST_LEN(LEN1, LEN2, LEN3, WIDE);
std::cout << "| std |";
FUN_TEST2(std, binary_search, LEN1);
FUN_TEST2(std, binary_search, LEN2);
FUN_TEST2(std, binary_search, LEN3);
std::cout << std::endl << "| mystl |";
FUN_TEST2(mystl, binary_search, LEN1);
FUN_TEST2(mystl, binary_search, LEN2);
FUN_TEST2(mystl, binary_search, LEN3);
std::cout << std::endl;
}
void binary_search_test() // 二分查找性能测试函数
{
std::cout << "[------------------- function : binary_search ------------------]" << std::endl;
std::cout << "| orders of magnitude |";
TEST_LEN(LEN1, LEN2, LEN3, WIDE); // 打印测试长度
std::cout << "| std |";
FUN_TEST2(std, binary_search, LEN1); // 测试标准库二分查找
FUN_TEST2(std, binary_search, LEN2);
FUN_TEST2(std, binary_search, LEN3);
std::cout << std::endl << "| mystl |";
FUN_TEST2(mystl, binary_search, LEN1); // 测试自定义库二分查找
FUN_TEST2(mystl, binary_search, LEN2);
FUN_TEST2(mystl, binary_search, LEN3);
std::cout << std::endl;
}
void sort_test()
{
std::cout << "[----------------------- function : sort -----------------------]" << std::endl;
std::cout << "| orders of magnitude |";
TEST_LEN(LEN1, LEN2, LEN3, WIDE);
std::cout << "| std |";
FUN_TEST1(std, sort, LEN1);
FUN_TEST1(std, sort, LEN2);
FUN_TEST1(std, sort, LEN3);
std::cout << std::endl << "| mystl |";
FUN_TEST1(mystl, sort, LEN1);
FUN_TEST1(mystl, sort, LEN2);
FUN_TEST1(mystl, sort, LEN3);
std::cout << std::endl;
}
void sort_test() // 排序性能测试函数
{
std::cout << "[----------------------- function : sort -----------------------]" << std::endl;
std::cout << "| orders of magnitude |";
TEST_LEN(LEN1, LEN2, LEN3, WIDE); // 打印测试长度
std::cout << "| std |";
FUN_TEST1(std, sort, LEN1); // 测试标准库排序
FUN_TEST1(std, sort, LEN2);
FUN_TEST1(std, sort, LEN3);
std::cout << std::endl << "| mystl |";
FUN_TEST1(mystl, sort, LEN1); // 测试自定义库排序
FUN_TEST1(mystl, sort, LEN2);
FUN_TEST1(mystl, sort, LEN3);
std::cout << std::endl;
}
void algorithm_performance_test()
{
#if PERFORMANCE_TEST_ON
std::cout << "[===============================================================]" << std::endl;
std::cout << "[--------------- Run algorithm performance test ----------------]" << std::endl;
sort_test();
binary_search_test();
std::cout << "[--------------- End algorithm performance test ----------------]" << std::endl;
std::cout << "[===============================================================]" << std::endl;
void algorithm_performance_test() // 算法性能测试入口函数
{
#if PERFORMANCE_TEST_ON // 如果定义了性能测试宏,则执行测试
std::cout << "[===============================================================]" << std::endl;
std::cout << "[--------------- Run algorithm performance test ----------------]" << std::endl;
sort_test(); // 运行排序性能测试
binary_search_test(); // 运行二分查找性能测试
std::cout << "[--------------- End algorithm performance test ----------------]" << std::endl;
std::cout << "[===============================================================]" << std::endl;
#endif // PERFORMANCE_TEST_ON
}
}
} // namespace algorithm_performance_test
} // namespace test
} // namespace mystl
} // namespace algorithm_performance_test
} // namespace test
} // namespace mystl
#endif // !MYTINYSTL_ALGORITHM_PERFORMANCE_TEST_H_

Loading…
Cancel
Save