astar/tools/graphic.py

92 lines
3.2 KiB
Python
Raw Normal View History

# Based on work: https://int-i.github.io/python/2021-11-07/matplotlib-google-benchmark-visualization/
# Modified by: Bensuperpc
from argparse import ArgumentParser
from itertools import groupby
import json
import operator
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import pandas as pd
# Extract the benchmark name from the benchmark name string
def extract_label_from_benchmark(benchmark):
bench_full_name = benchmark['name']
bench_name = bench_full_name.split('/')[0] # Remove all after /
if (bench_name.startswith('BM_')): # Remove if string start with BM_
return bench_name[3:] # Remove BM_
else:
return bench_name
# Extract the benchmark size from the benchmark
def extract_size_from_benchmark(benchmark):
bench_name = benchmark['name']
return bench_name.split('/')[1] # Remove all before /
if __name__ == "__main__":
# ./prog_name --benchmark_format=json --benchmark_out=result.json
parser = ArgumentParser()
parser.add_argument('path', help='benchmark result json file')
args = parser.parse_args()
with open(args.path) as file:
benchmark_result = json.load(file)
benchmarks = benchmark_result['benchmarks']
elapsed_times = groupby(benchmarks, extract_label_from_benchmark)
data1 = None
data2 = None
for key, group in elapsed_times:
benchmark = list(group)
x = list(map(extract_size_from_benchmark, benchmark))
y1 = list(map(operator.itemgetter('bytes_per_second'), benchmark))
y2 = list(map(operator.itemgetter('items_per_second'), benchmark))
if data1 is None:
data1 = pd.DataFrame({'size': x, key: y1})
else:
data1[key] = y1
if data2 is None:
data2 = pd.DataFrame({'size': x, key: y2})
else:
data2[key] = y2
df1 = pd.melt(data1, id_vars=['size'], var_name='Benchmark', value_name='bytes_per_second')
df1_max_indices = df1.groupby(['size', 'Benchmark'])['bytes_per_second'].transform(max) == df1['bytes_per_second']
df1 = df1.loc[df1_max_indices]
df1.reset_index(drop=True, inplace=True)
df2 = pd.melt(data2, id_vars=['size'], var_name='Benchmark', value_name='items_per_second')
df2_max_indices = df2.groupby(['size', 'Benchmark'])['items_per_second'].transform(max) == df2['items_per_second']
df2 = df2.loc[df2_max_indices]
df2.reset_index(drop=True, inplace=True)
sns.set_theme()
fig, ax = plt.subplots(2, 1)
fig.set_size_inches(16, 9)
fig.set_dpi(96)
sns.lineplot(data=df1, x='size', y='bytes_per_second', hue='Benchmark', ax=ax[0])
sns.lineplot(data=df2, x='size', y='items_per_second', hue='Benchmark', ax=ax[1])
ax[0].set_title('Bytes per second')
ax[1].set_title('Items per second')
ax[0].set_xlabel('Array size')
ax[1].set_xlabel('Array size')
ax[0].set_ylabel('byte per second')
ax[1].set_ylabel('items per second')
fig.tight_layout()
plt.savefig('benchmark.png', bbox_inches='tight', dpi=300)
plt.show()