Skip to content

Instantly share code, notes, and snippets.

@benhoyt
Created April 13, 2024 04:53
Show Gist options
  • Save benhoyt/50eea688bc8de697218fe982488e2467 to your computer and use it in GitHub Desktop.
Save benhoyt/50eea688bc8de697218fe982488e2467 to your computer and use it in GitHub Desktop.
Measure Go version performance with GoAWK
import csv
import os
import subprocess
import time
print('| Go version | binary size (MB) | countwords (s) | sumloop (s) |')
print('| ---------- | ---------------- | -------------- | ----------- |')
with open('goversions.csv', 'w', newline='') as f:
writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
writer.writerow(['Go version', 'binary size (MB)', 'countwords (s)', 'sumloop (s)'])
for i in range(23):
for has_pgo in [False, True] if i >= 20 else [False]:
version = f'1.{i}'
binary_path = f'./goawk_{version}_pgo' if has_pgo else f'./goawk_{version}'
binary_size = os.path.getsize(binary_path)
src = '{ for (i=1; i<=NF; i++) counts[tolower($i)]++ } END { for (k in counts) print k, counts[k] }'
times = []
for _ in range(3):
start = time.time()
subprocess.run([binary_path, src, '/home/ben/h/countwords/kjvbible_x10.txt'], stdout=subprocess.DEVNULL)
elapsed = time.time() - start
times.append(elapsed)
countwords_time = min(times)
src = 'BEGIN { for (; i<10000000; i++) s += i+i+i+i+i }'
times = []
for _ in range(3):
start = time.time()
subprocess.run([binary_path, src])
elapsed = time.time() - start
times.append(elapsed)
sumloop_time = min(times)
size_mb = binary_size / (1024*1024)
go_version = f'{version} PGO' if has_pgo else version
print(f'| {go_version:10} | {size_mb:>16.2f} | {countwords_time:>14.2f} | {sumloop_time:>11.2f} |')
writer.writerow([go_version, size_mb, countwords_time, sumloop_time])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment