1
0
walkingonions-boosted/analysis/plotonionperf.py

133 lines
3.9 KiB
Python
Raw Normal View History

2022-03-17 16:05:34 +00:00
#!/usr/bin/env python3
import os
import sys
import csv
import fileinput
import subprocess
def parse_onionperf_file(file_name):
res = {}
# fetch sources
sources = fetch_sources(file_name)
# collect circuit building times for source
for s in sources:
with open(os.path.dirname(__file__) + "/datasets/" + file_name, 'r') as f:
reader = csv.DictReader(filter(lambda row: row[0]!='#', f), delimiter=',')
s_counter = 0
s_total = 0
for row in reader:
if row['source'] == s:
# we have completed a circuit after reaching the exit relay
if int(row['position']) == 3:
s_counter += 1
s_total += float(row['md'])
# calculate average
if s_counter != 0:
res[s] = s_total/s_counter
return res
def fetch_sources(file_name):
sources = []
with open(os.path.dirname(__file__) + "/datasets/" + file_name, 'r') as f:
# open the file rows as dicts, skip the comments
reader = csv.DictReader(filter(lambda row: row[0]!='#', f), delimiter=',')
# fetch sources
for row in reader:
if row['source'] != '' and row['source'] not in sources:
sources.append(row['source'])
f.close()
return sources
# Plot the relative circuit building times using gnuplot
if __name__ == '__main__':
# set some defaults
file_name = os.getenv('CB_FILE')
# fetch average times from onion performance file
avg_times = parse_onionperf_file(file_name)
#print(avg_times)
# fetch simulator times
sim_times = {}
dats = []
dats += [each for each in os.listdir('.') if each.endswith('.dat') and 'client_c_relative' not in each]
for dat in dats:
with open(dat, 'r') as f:
for line in f.readlines():
sim_times.update({dat: float(line.split(" ")[15])})
#print(sim_times)
# vanilla is base
base = sim_times['vanilla_none.dat']
# calculate ratios
ratios = {
'tele-thresh': sim_times['telescoping_threshsig.dat']/base,
'tele-merkle': sim_times['telescoping_merkle.dat']/base,
'singlep-thresh': sim_times['singlepass_threshsig.dat']/base,
'singlep-merkle': sim_times['singlepass_merkle.dat']/base
}
#print(ratios)
# calculate relative times
relative_times = {}
for avg in avg_times.keys():
for ratio in ratios.keys():
relative_times.update({
avg + "-vanilla": avg_times[avg]
})
relative_times.update({
avg + "-" + ratio: avg_times[avg] * ratios[ratio]
})
#print(relative_times)
# Create dat file
for source in fetch_sources(file_name):
with open("client_c_relative-%s.dat" % source, "w") as datout:
for k in relative_times.keys():
if source in k:
datout.write("%s " % \
(relative_times[k]))
datout.close()
# Build plot
for source in fetch_sources(file_name):
output_file = "client_c_relative-%s.pdf" % source
gpcode = """set terminal pdf font "DejaVuSans,14" size 5,2.25
set output '%s'
set title 'Relative circuit building times'
set arrow from %s
set grid y
set key out
unset xtics
set ylabel 'Relative times (ms)'
plot """ % (output_file, max(relative_times.values()))
col = 1
firstplot = True
for k in relative_times.keys():
if source in k and source:
if firstplot is False:
gpcode += ", "
gpcode += "'client_c_relative-%s.dat' using 0:%d with points title '%s'" % (source, col, k)
col += 1
firstplot = False
gp = subprocess.Popen(['gnuplot', '-'], stdin=subprocess.PIPE)
gp.communicate(gpcode.encode('ascii'))