#!/usr/bin/env python3 from concurrent.futures import ThreadPoolExecutor, wait import time def one_thread(chunks, repeats): for repeat in range(repeats): b''.join(chunks) def bench(threads, size, chunks, repeats): chunks = [b'x' * size for _ in range(chunks)] with ThreadPoolExecutor(threads) as pool: # warmup wait([pool.submit(one_thread, chunks, repeats//100+1) for _ in range(threads)]) start = time.monotonic() wait([pool.submit(one_thread, chunks, repeats) for _ in range(threads)]) elapsed = time.monotonic() - start return elapsed def main(): threads = 4 print('size, chunks, rate[MB]') for size in (8, 16, 32, 64, 128, 256, 512, 1024): for chunks in (8, 16, 32, 64, 128, 256, 512, 1024): repeats = max(3, 10**8 // (size * chunks)) elapsed = bench(threads, size, chunks, repeats) rate = size * chunks * repeats / elapsed rate_mb = rate / 1e6 print(f'{size},{chunks},{rate_mb:.2f}') main()