diff options
Diffstat (limited to 'scripts/benchmarkCompile.py')
-rwxr-xr-x | scripts/benchmarkCompile.py | 148 |
1 files changed, 0 insertions, 148 deletions
diff --git a/scripts/benchmarkCompile.py b/scripts/benchmarkCompile.py deleted file mode 100755 index 34113b9e..00000000 --- a/scripts/benchmarkCompile.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import print_function - -import time, subprocess, sys, os, shutil, glob, random -import argparse - -def median(lst): - lst = sorted(lst) - mid, odd = divmod(len(lst), 2) - if odd: - return lst[mid] - else: - return (lst[mid - 1] + lst[mid]) / 2.0 - -def mean(lst): - return float(sum(lst)) / max(len(lst), 1) - -compiler_path = '' -flags = [] - -main_file = r''' -#define CATCH_CONFIG_MAIN -#include "catch.hpp" -''' -main_name = 'catch-main.cpp' - -dir_name = 'benchmark-dir' - -files = 20 -test_cases_in_file = 20 -sections_in_file = 4 -assertions_per_section = 5 - -checks = [ - 'a != b', 'a != c', 'a != d', 'a != e', 'b != c', 'b != d', 'b != e', 'c != d', 'c != e', 'd != e', 'a + a == a', - 'a + b == b', 'a + c == c', 'a + d == d', 'a + e == e', 'b + a == b', 'b + b == c', 'b + c == d', - 'b + d == e', 'c + a == c', 'c + b == d', 'c + c == e', 'd + a == d', 'd + b == e', 'e + a == e', - 'a + a + a == a', 'b + c == a + d', 'c + a + a == a + b + b + a', - 'a < b', 'b < c', 'c < d', 'd < e', 'a >= a', 'd >= b', -] - -def create_temp_dir(): - if os.path.exists(dir_name): - shutil.rmtree(dir_name) - os.mkdir(dir_name) - -def copy_catch(path_to_catch): - shutil.copy(path_to_catch, dir_name) - -def create_catch_main(): - with open(main_name, 'w') as f: - f.write(main_file) - -def compile_main(): - start_t = time.time() - subprocess.check_call([compiler_path, main_name, '-c'] + flags) - end_t = time.time() - return end_t - start_t - -def compile_files(): - cpp_files = glob.glob('tests*.cpp') - start_t = time.time() - subprocess.check_call([compiler_path, '-c'] + flags + cpp_files) - end_t = time.time() - return end_t - start_t - -def link_files(): - obj_files = glob.glob('*.o') - start_t = time.time() - subprocess.check_call([compiler_path] + flags + obj_files) - end_t = time.time() - return end_t - start_t - -def benchmark(func): - results = [func() for i in range(10)] - return mean(results), median(results) - -def char_range(start, end): - for c in range(ord(start), ord(end)): - yield chr(c) - -def generate_sections(fd): - for i in range(sections_in_file): - fd.write(' SECTION("Section {}") {{\n'.format(i)) - fd.write('\n'.join(' CHECK({});'.format(check) for check in random.sample(checks, assertions_per_section))) - fd.write(' }\n') - - -def generate_file(file_no): - with open('tests{}.cpp'.format(file_no), 'w') as f: - f.write('#include "catch.hpp"\n\n') - for i in range(test_cases_in_file): - f.write('TEST_CASE("File {} test {}", "[.compile]"){{\n'.format(file_no, i)) - for i, c in enumerate(char_range('a', 'f')): - f.write(' int {} = {};\n'.format(c, i)) - generate_sections(f) - f.write('}\n\n') - - -def generate_files(): - create_catch_main() - for i in range(files): - generate_file(i) - - -options = ['all', 'main', 'files', 'link'] - -parser = argparse.ArgumentParser(description='Benchmarks Catch\'s compile times against some synthetic tests') -# Add first arg -- benchmark type -parser.add_argument('benchmark_kind', nargs='?', default='all', choices=options, help='What kind of benchmark to run, default: all') - -# Args to allow changing header/compiler -parser.add_argument('-I', '--catch-header', default='catch.hpp', help = 'Path to catch.hpp, default: catch.hpp') -parser.add_argument('-c', '--compiler', default='g++', help = 'Compiler to use, default: g++') - -parser.add_argument('-f', '--flags', help = 'Flags to be passed to the compiler. Pass as "," separated list') - -# Allow creating files only, without running the whole thing -parser.add_argument('-g', '--generate-files', action='store_true', help='Generate test files and quit') - -args = parser.parse_args() - -compiler_path = args.compiler -catch_path = args.catch_header - -if args.generate_files: - create_temp_dir() - copy_catch(catch_path) - os.chdir(dir_name) - # now create the fake test files - generate_files() - # Early exit - print('Finished generating files') - exit(1) - -os.chdir(dir_name) - -if args.flags: - flags = args.flags.split(',') - -print('Time needed for ...') -if args.benchmark_kind in ('all', 'main'): - print(' ... compiling main, mean: {:.2f}, median: {:.2f} s'.format(*benchmark(compile_main))) -if args.benchmark_kind in ('all', 'files'): - print(' ... compiling test files, mean: {:.2f}, median: {:.2f} s'.format(*benchmark(compile_files))) -if args.benchmark_kind in ('all', 'link'): - print(' ... linking everything, mean: {:.2f}, median: {:.2f} s'.format(*benchmark(link_files))) |