Loading perf_tests/perf_metadata.cpp +31 −15 Changes for perf_tests/perf_metadata.cpp: 31 added lines, 15 removed lines. Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ #include <getopt.h> #include <dirent.h> #include <fstream> #include <libgen.h> #include <sys/stat.h> Loading Loading @@ -320,6 +321,7 @@ void print_usage(const char* prog) { << " --batch Use batch mode for mkdir test\n" << " --no-cleanup Don't cleanup test files after benchmark\n" << " --csv Output results in CSV format (to stdout)\n" << " --csv-file <path> Write CSV results to a file\n" << " --help Show this help message\n"; } Loading @@ -336,6 +338,7 @@ int main(int argc, char* argv[]) { bool cleanup = true; bool csv_output = false; std::string csv_file; static struct option long_options[] = { {"mountdir", required_argument, 0, 'm'}, Loading @@ -345,12 +348,13 @@ int main(int argc, char* argv[]) { {"batch", no_argument, 0, 'b'}, {"no-cleanup", no_argument, 0, 'n'}, {"csv", no_argument, 0, 'c'}, {"csv-file", required_argument, 0, 'o'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; int opt; while ((opt = getopt_long(argc, argv, "m:i:f:w:bnch", long_options, nullptr)) != -1) { while ((opt = getopt_long(argc, argv, "m:i:f:w:bnco:h", long_options, nullptr)) != -1) { switch (opt) { case 'm': mountdir = optarg; break; case 'i': iterations = std::atoi(optarg); break; Loading @@ -359,6 +363,7 @@ int main(int argc, char* argv[]) { case 'b': batch_mode = true; break; case 'n': cleanup = false; break; case 'c': csv_output = true; break; case 'o': csv_file = optarg; csv_output = true; break; case 'h': print_usage(argv[0]); return 0; default: print_usage(argv[0]); return 1; } Loading Loading @@ -413,7 +418,7 @@ int main(int argc, char* argv[]) { mkdir_batch_done = true; } mkdir_bench.cleanup(); if(cleanup) mkdir_bench.cleanup(); } // ---- 2. Stat benchmark ---- Loading @@ -434,7 +439,7 @@ int main(int argc, char* argv[]) { std::cout << format_timing(stat_result, "Stat all files (" + std::to_string(num_files) + " files)", iterations * num_files) << "\n"; stat_bench.cleanup(); if(cleanup) stat_bench.cleanup(); } // ---- 3. Readdir benchmark ---- Loading @@ -456,7 +461,7 @@ int main(int argc, char* argv[]) { ); std::cout << format_timing(readdir_result, "Readdir (" + std::to_string(num_files) + " entries)", iterations) << "\n"; readdir_bench.cleanup(); if(cleanup) readdir_bench.cleanup(); } // ---- 4. Symlink benchmark ---- Loading Loading @@ -490,7 +495,7 @@ int main(int argc, char* argv[]) { ); std::cout << format_timing(symlink_resolve_result, "Symlink resolve (readlink)", iterations) << "\n"; symlink_bench.cleanup(); if(cleanup) symlink_bench.cleanup(); } // ---- 5. Rename benchmark ---- Loading @@ -509,7 +514,7 @@ int main(int argc, char* argv[]) { ); std::cout << format_timing(rename_result, "Rename (back and forth)", iterations) << "\n"; rename_bench.cleanup(); if(cleanup) rename_bench.cleanup(); } // Cleanup Loading @@ -522,19 +527,30 @@ int main(int argc, char* argv[]) { // CSV output if (csv_output) { std::cout << format_timing_csv_header() << "\n"; std::cout << format_timing_csv("metadata", "mkdir_single", mkdir_single_result, iterations) << "\n"; std::ostringstream csv; csv << format_timing_csv_header() << "\n"; csv << format_timing_csv("metadata", "mkdir_single", mkdir_single_result, iterations); if (mkdir_batch_done) { std::cout << format_timing_csv("metadata", "mkdir_batch", mkdir_batch_result, iterations) << "\n"; csv << format_timing_csv("metadata", "mkdir_batch", mkdir_batch_result, iterations); } std::cout << format_timing_csv("metadata", "stat_all_files", stat_result, iterations * num_files) << "\n"; std::cout << format_timing_csv("metadata", "readdir", readdir_result, iterations) << "\n"; std::cout << format_timing_csv("metadata", "symlink_create", symlink_create_result, iterations) << "\n"; csv << format_timing_csv("metadata", "stat_all_files", stat_result, iterations * num_files); csv << format_timing_csv("metadata", "readdir", readdir_result, iterations); csv << format_timing_csv("metadata", "symlink_create", symlink_create_result, iterations); if (symlink_batch_done) { std::cout << format_timing_csv("metadata", "symlink_batch_create", symlink_batch_result, iterations) << "\n"; csv << format_timing_csv("metadata", "symlink_batch_create", symlink_batch_result, iterations); } csv << format_timing_csv("metadata", "symlink_resolve", symlink_resolve_result, iterations); csv << format_timing_csv("metadata", "rename", rename_result, iterations); if(!csv_file.empty()) { std::ofstream file(csv_file); if(!file) { std::cerr << "Error: Failed to open CSV file: " << csv_file << "\n"; return 1; } file << csv.str(); } else { std::cout << csv.str(); } std::cout << format_timing_csv("metadata", "symlink_resolve", symlink_resolve_result, iterations) << "\n"; std::cout << format_timing_csv("metadata", "rename", rename_result, iterations) << "\n"; } std::cout << "\n=== Metadata benchmark complete ===\n"; Loading Loading
perf_tests/perf_metadata.cpp +31 −15 Changes for perf_tests/perf_metadata.cpp: 31 added lines, 15 removed lines. Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ #include <getopt.h> #include <dirent.h> #include <fstream> #include <libgen.h> #include <sys/stat.h> Loading Loading @@ -320,6 +321,7 @@ void print_usage(const char* prog) { << " --batch Use batch mode for mkdir test\n" << " --no-cleanup Don't cleanup test files after benchmark\n" << " --csv Output results in CSV format (to stdout)\n" << " --csv-file <path> Write CSV results to a file\n" << " --help Show this help message\n"; } Loading @@ -336,6 +338,7 @@ int main(int argc, char* argv[]) { bool cleanup = true; bool csv_output = false; std::string csv_file; static struct option long_options[] = { {"mountdir", required_argument, 0, 'm'}, Loading @@ -345,12 +348,13 @@ int main(int argc, char* argv[]) { {"batch", no_argument, 0, 'b'}, {"no-cleanup", no_argument, 0, 'n'}, {"csv", no_argument, 0, 'c'}, {"csv-file", required_argument, 0, 'o'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; int opt; while ((opt = getopt_long(argc, argv, "m:i:f:w:bnch", long_options, nullptr)) != -1) { while ((opt = getopt_long(argc, argv, "m:i:f:w:bnco:h", long_options, nullptr)) != -1) { switch (opt) { case 'm': mountdir = optarg; break; case 'i': iterations = std::atoi(optarg); break; Loading @@ -359,6 +363,7 @@ int main(int argc, char* argv[]) { case 'b': batch_mode = true; break; case 'n': cleanup = false; break; case 'c': csv_output = true; break; case 'o': csv_file = optarg; csv_output = true; break; case 'h': print_usage(argv[0]); return 0; default: print_usage(argv[0]); return 1; } Loading Loading @@ -413,7 +418,7 @@ int main(int argc, char* argv[]) { mkdir_batch_done = true; } mkdir_bench.cleanup(); if(cleanup) mkdir_bench.cleanup(); } // ---- 2. Stat benchmark ---- Loading @@ -434,7 +439,7 @@ int main(int argc, char* argv[]) { std::cout << format_timing(stat_result, "Stat all files (" + std::to_string(num_files) + " files)", iterations * num_files) << "\n"; stat_bench.cleanup(); if(cleanup) stat_bench.cleanup(); } // ---- 3. Readdir benchmark ---- Loading @@ -456,7 +461,7 @@ int main(int argc, char* argv[]) { ); std::cout << format_timing(readdir_result, "Readdir (" + std::to_string(num_files) + " entries)", iterations) << "\n"; readdir_bench.cleanup(); if(cleanup) readdir_bench.cleanup(); } // ---- 4. Symlink benchmark ---- Loading Loading @@ -490,7 +495,7 @@ int main(int argc, char* argv[]) { ); std::cout << format_timing(symlink_resolve_result, "Symlink resolve (readlink)", iterations) << "\n"; symlink_bench.cleanup(); if(cleanup) symlink_bench.cleanup(); } // ---- 5. Rename benchmark ---- Loading @@ -509,7 +514,7 @@ int main(int argc, char* argv[]) { ); std::cout << format_timing(rename_result, "Rename (back and forth)", iterations) << "\n"; rename_bench.cleanup(); if(cleanup) rename_bench.cleanup(); } // Cleanup Loading @@ -522,19 +527,30 @@ int main(int argc, char* argv[]) { // CSV output if (csv_output) { std::cout << format_timing_csv_header() << "\n"; std::cout << format_timing_csv("metadata", "mkdir_single", mkdir_single_result, iterations) << "\n"; std::ostringstream csv; csv << format_timing_csv_header() << "\n"; csv << format_timing_csv("metadata", "mkdir_single", mkdir_single_result, iterations); if (mkdir_batch_done) { std::cout << format_timing_csv("metadata", "mkdir_batch", mkdir_batch_result, iterations) << "\n"; csv << format_timing_csv("metadata", "mkdir_batch", mkdir_batch_result, iterations); } std::cout << format_timing_csv("metadata", "stat_all_files", stat_result, iterations * num_files) << "\n"; std::cout << format_timing_csv("metadata", "readdir", readdir_result, iterations) << "\n"; std::cout << format_timing_csv("metadata", "symlink_create", symlink_create_result, iterations) << "\n"; csv << format_timing_csv("metadata", "stat_all_files", stat_result, iterations * num_files); csv << format_timing_csv("metadata", "readdir", readdir_result, iterations); csv << format_timing_csv("metadata", "symlink_create", symlink_create_result, iterations); if (symlink_batch_done) { std::cout << format_timing_csv("metadata", "symlink_batch_create", symlink_batch_result, iterations) << "\n"; csv << format_timing_csv("metadata", "symlink_batch_create", symlink_batch_result, iterations); } csv << format_timing_csv("metadata", "symlink_resolve", symlink_resolve_result, iterations); csv << format_timing_csv("metadata", "rename", rename_result, iterations); if(!csv_file.empty()) { std::ofstream file(csv_file); if(!file) { std::cerr << "Error: Failed to open CSV file: " << csv_file << "\n"; return 1; } file << csv.str(); } else { std::cout << csv.str(); } std::cout << format_timing_csv("metadata", "symlink_resolve", symlink_resolve_result, iterations) << "\n"; std::cout << format_timing_csv("metadata", "rename", rename_result, iterations) << "\n"; } std::cout << "\n=== Metadata benchmark complete ===\n"; Loading