#!/usr/bin/env python3
import os
uarchdate = {
'airmont':20150401, # XXX: not sure about exact date
'broadwell':20141027,
'core2':20060726,
'goldmont':20160418,
'haswell':20130604,
'skylake':20150805,
'tigerlake':20200902,
'zen3':20201105,
}
uarchname = {
'airmont':'Airmont',
'broadwell':'Broadwell',
'core2':'Core 2',
'goldmont':'Goldmont',
'haswell':'Haswell',
'skylake':'Skylake',
'tigerlake':'Tiger Lake',
'zen3':'Zen 3',
}
def sortkey(m):
uarch = ''.join(m.split('-')[:1])
return uarchdate[uarch]
machines = sorted(os.listdir('benchmarks'),key=sortkey,reverse=True)
def lib25519(m):
uarch = uarchname[''.join(m.split('-')[:1])]
with open(f'benchmarks/{m}') as f:
for line in f:
line = line.split()
if len(line) < 4: continue
if line[:3] == ['dh_x25519_keypair','selected','32']:
dh_keypair = int(line[3])
if line[:3] == ['dh_x25519','selected','32']:
dh = int(line[3])
if line[:3] == ['sign_ed25519_keypair','selected','32']:
sign_keypair = int(line[3])
if line[:3] == ['sign_ed25519','selected','59']:
sign = int(line[3])
if line[:3] == ['sign_ed25519_open','selected','59']:
verify = int(line[3])
if line[:3] == ['nPbatch_montgomery25519','selected','16']:
nPbatch_16 = int(line[3])
if line[:3] == ['multiscalar_ed25519','selected','16']:
multiscalar_16 = int(line[3])
C = ''
D = ''
out.write(f'| | {C}lib25519{D} | {C}{dh_keypair}{D} | {C}{dh}{D} | {C}{nPbatch_16//16}{D} | {C}{sign_keypair}{D} | {C}{sign}{D} | {C}{verify}{D} | {C}{multiscalar_16//16}\n')
def openssl(m):
uarch = uarchname[''.join(m.split('-')[:1])]
with open(f'speedcomparison/openssl/{m}') as f:
for line in f:
line = line.split()
if len(line) < 2: continue
if line[:1] == ['x25519-keygen-main']:
dh_keypair = int(line[1])
if line[:1] == ['x25519-dh-main']:
dh = int(line[1])
if line[:1] == ['ed25519-keygen-main']:
sign_keypair = int(line[1])
if line[:1] == ['ed25519-sign-main']:
sign = int(line[1])
if line[:1] == ['ed25519-verify-main']:
verify = int(line[1])
C = ''
D = ''
out.write(f'| {uarch} | {C}OpenSSL{D} | {C}{dh_keypair}{D} | {C}{dh}{D} | | {C}{sign_keypair}{D} | {C}{sign}{D} | {C}{verify}{D} | |\n')
with open('doc/speed.md','w') as out:
with open('autogen/md-speed-top') as f:
out.write(f.read())
out.write('\n\n')
out.write('| uarch | software | X key | X dh | X batch | Ed key | Ed sign | Ed verif | Ed MSM |\n')
out.write('| :---- | :------- | ----: | ---: | ------: | -----: | ------: | -------: | -----: |\n')
for m in machines:
openssl(m)
lib25519(m)
out.write('\n\n')
with open('autogen/md-speed-bot') as f:
out.write(f.read())