Skip to content

Commit 23dfe82

Browse files
committed
add 'setup.py speed' to run benchmarks
refs #30
1 parent a595fd7 commit 23dfe82

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ python:
99
install: true
1010
script:
1111
- python setup.py test
12+
- python setup.py speed

setup.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
except ImportError:
66
# but most users really don't require it
77
from distutils.core import setup, Command
8+
import timeit
89

910
import versioneer
1011
versioneer.versionfile_source = "ecdsa/_version.py"
@@ -35,6 +36,44 @@ def run(self):
3536
# all tests os.exit(1) upon failure
3637
commands["test"] = Test
3738

39+
class Speed(Test):
40+
description = "run benchmark suite"
41+
def run(self):
42+
def do(setup_statements, statement):
43+
# extracted from timeit.py
44+
t = timeit.Timer(stmt=statement,
45+
setup="\n".join(setup_statements))
46+
# determine number so that 0.2 <= total time < 2.0
47+
for i in range(1, 10):
48+
number = 10**i
49+
x = t.timeit(number)
50+
if x >= 0.2:
51+
break
52+
return x / number
53+
54+
for curve in ["NIST192p", "NIST224p", "NIST256p", "SECP256k1",
55+
"NIST384p", "NIST521p"]:
56+
S1 = "import ecdsa"
57+
S2 = "sk = ecdsa.SigningKey.generate(ecdsa.%s)" % curve
58+
S3 = "msg = 'msg'"
59+
S4 = "sig = sk.sign(msg)"
60+
S5 = "vk = sk.get_verifying_key()"
61+
S6 = "vk.verify(sig, msg)"
62+
# We happen to know that .generate() also calculates the
63+
# verifying key, which is the time-consuming part. If the code
64+
# were changed to lazily calculate vk, we'd need to change this
65+
# benchmark to loop over S5 instead of S2
66+
keygen = do([S1], S2)
67+
sign = do([S1,S2,S3], S4)
68+
verf = do([S1,S2,S3,S4,S5], S6)
69+
import ecdsa
70+
sig = ecdsa.SigningKey.generate(getattr(ecdsa, curve)).sign("msg")
71+
print "%9s: siglen=%3d, keygen=%.3fs, sign=%.3fs, verify=%.3fs" \
72+
% (curve, len(sig), keygen, sign, verf)
73+
74+
commands["speed"] = Speed
75+
76+
3877
setup(name="ecdsa",
3978
version=versioneer.get_version(),
4079
description="ECDSA cryptographic signature library (pure python)",

0 commit comments

Comments
 (0)