diff --git a/string/test/test.cpp b/string/test/test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ec797ef42e468cb310141b6d6879791f9ee478e3 --- /dev/null +++ b/string/test/test.cpp @@ -0,0 +1,84 @@ +// 编译测试代码的时候要加O3优化,优先使用preload方法覆盖系统memcpy。 +#include +#include +#include +#include +#include + +#define NUM_TESTS 1000000 + + +extern "C" void* memcpy1(void* dst, const void* src, size_t size); + +// 如果你要验证预取的收益,需要在执行memcpy之后清理缓存。 +void flush_cache() { + volatile char* flush = (volatile char*)malloc(1024 * 1024); // 1MB + for (int i = 0; i < 1024 * 1024; i += 64) { + flush[i] = i; + } + free((void*)flush); +} + + + +void test_memcpy_performance(const size_t sizes[], size_t num_sizes) { + + struct timespec start, end; + long long total_time_ns; + + for (size_t i = 0; i < num_sizes; ++i) { + size_t size = sizes[i]; + char* src = (char *)malloc(size); + char* dst = (char *)malloc(size); + if (src == NULL || dst == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(EXIT_FAILURE); + } + for (size_t j = 0; j < size; j++) { + src[j] = (char)(j % 256); + } + + clock_gettime(CLOCK_MONOTONIC, &start); + for (int j = 0; j < NUM_TESTS; ++j) { + memcpy1(dst, src, size); + // flush_cache(); + } + clock_gettime(CLOCK_MONOTONIC, &end); + total_time_ns = (end.tv_sec - start.tv_sec) * 1000000000LL + (end.tv_nsec - start.tv_nsec); + double avg_sys = (double)total_time_ns / NUM_TESTS; + + printf("%.3f\n", size, avg_sys); + + if (memcmp(src, dst, size) != 0) { + fprintf(stderr, "Error: memcpy verification failed for size %zu\n", size); + exit(EXIT_FAILURE); + } + + free(src); + free(dst); + } +} + + +int main(int argc, char* argv[]) { + + + + int start = 0; + int end = 200; + int size = end - size + 1; + size_t sizes[size + 10]; + for (start = 0; start < size; start++) + { + sizes[start] = start + 1; + } + + size_t additional_sizes[] = {256, 500, 512, 1024, 2000, 4096, 16384, 30000, 65536, 1024*1024}; + int num_additional = sizeof(additional_sizes) / sizeof(additional_sizes[0]); + for (int i = 0; i < num_additional; i++) { + sizes[size + i] = additional_sizes[i]; + } + + size_t total_sizes = size + num_additional; + test_memcpy_performance(sizes, total_sizes); +} \ No newline at end of file