bench/plot.py (57 lines of code) (raw):
#!/usr/bin/python
# Install matlibplot e.g. via 'pip install matplotlib' or via 'apt install python3-matplotlib'
import matplotlib.pyplot as plt
# Specify the path to your file
file_path = "bench.out"
goos = ""
goarch = ""
pkg = ""
cpu = ""
nCPU = "1"
funcName = ""
# Read data from the file and parse it into the data variable
data = []
with (open(file_path, "r") as file):
for line in file:
# Assuming each line has the format "BenchmarkName value"
parts = line.split()
if parts[0].startswith("#"):
continue
if len(parts) >= 2 and parts[0].endswith(":"):
if parts[0] == "goos:":
goos = parts[1]
if parts[0] == "goarch:":
goarch = parts[1]
if parts[0] == "cpu:":
cpu = " ".join(parts[1:])
continue
if len(parts) == 3: # skip summary
continue
if len(parts) >= 3:
if '-' in parts[0]:
nCPU = parts[0].split('-')[1]
s = parts[0].split('-')[0]
if s.endswith('Get'):
keyType = 'int'
valType = 'int'
else:
keyType = s.split('_')[1]
valType = s.split('_')[2]
s = s.split('_')[0]
name = s.replace('Benchmark', '')
name = name.replace('Parallel', '')
for suffix in ('Add', 'Get'):
if name.endswith(suffix):
name = name[:-len(suffix)]
funcName = suffix
break
value = float(parts[2])
data.append((name, value))
# Sort data by value
data = sorted(data, key=lambda x: x[1])
# Extracting names and values from the data
names, values = zip(*data)
# Creating the bar chart
fig, ax = plt.subplots(figsize=(10, 8))
bars = ax.barh(names, values, color='skyblue')
plt.xlabel('Execution Time (ns/op)')
plt.title(f'OS: {goos}\nArch: {goarch}\nCPU: {cpu}\nGOMAXPROCS: {nCPU}\n\n{funcName}({keyType}, {valType}) Execution Time (smaller is better)')
ax.invert_yaxis()
# Adding text inside the bars
for bar in bars:
value = bar.get_width()
ax.text(2, bar.get_y() + bar.get_height() / 2, f'{value}', va='center', ha='left', fontsize=8, color='black')
plt.savefig('bench.png', bbox_inches='tight')
plt.show()
plt.close(fig)