summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2010-07-22 07:40:56 (GMT)
committerBrett Cannon <bcannon@gmail.com>2010-07-22 07:40:56 (GMT)
commit5db0c94072abad10c9d2df99eefd1f51eb84f2bc (patch)
tree61e592ddf4e113bdd3f3c4c2393d88970b1ac58b /Lib
parent3f8ecab589f9fab22a1d067a79aa6666568704b1 (diff)
downloadcpython-5db0c94072abad10c9d2df99eefd1f51eb84f2bc.zip
cpython-5db0c94072abad10c9d2df99eefd1f51eb84f2bc.tar.gz
cpython-5db0c94072abad10c9d2df99eefd1f51eb84f2bc.tar.bz2
Add importlib benchmarks which try to be "realistic" by importing the decimal
module which is the largest module in the stdlib.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/importlib/test/benchmark.py57
1 files changed, 50 insertions, 7 deletions
diff --git a/Lib/importlib/test/benchmark.py b/Lib/importlib/test/benchmark.py
index 6c8978f..b5de6c6 100644
--- a/Lib/importlib/test/benchmark.py
+++ b/Lib/importlib/test/benchmark.py
@@ -6,6 +6,7 @@ thus has no external changes made to import-related attributes in sys.
"""
from . import util
from .source import util as source_util
+import decimal
import imp
import importlib
import os
@@ -58,7 +59,7 @@ def builtin_mod(seconds, repeat):
def source_wo_bytecode(seconds, repeat):
- """Source w/o bytecode"""
+ """Source w/o bytecode: simple"""
sys.dont_write_bytecode = True
try:
name = '__importlib_test_benchmark__'
@@ -72,8 +73,23 @@ def source_wo_bytecode(seconds, repeat):
sys.dont_write_bytecode = False
+def decimal_wo_bytecode(seconds, repeat):
+ """Source w/o bytecode: decimal"""
+ name = 'decimal'
+ decimal_bytecode = imp.cache_from_source(decimal.__file__)
+ if os.path.exists(decimal_bytecode):
+ os.unlink(decimal_bytecode)
+ sys.dont_write_bytecode = True
+ try:
+ for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
+ seconds=seconds):
+ yield result
+ finally:
+ sys.dont_write_bytecode = False
+
+
def source_writing_bytecode(seconds, repeat):
- """Source writing bytecode"""
+ """Source writing bytecode: simple"""
assert not sys.dont_write_bytecode
name = '__importlib_test_benchmark__'
with source_util.create_modules(name) as mapping:
@@ -85,8 +101,19 @@ def source_writing_bytecode(seconds, repeat):
yield result
+def decimal_writing_bytecode(seconds, repeat):
+ """Source writing bytecode: decimal"""
+ assert not sys.dont_write_bytecode
+ name = 'decimal'
+ def cleanup():
+ sys.modules.pop(name)
+ os.unlink(imp.cache_from_source(decimal.__file__))
+ for result in bench(name, cleanup, repeat=repeat, seconds=seconds):
+ yield result
+
+
def source_using_bytecode(seconds, repeat):
- """Bytecode w/ source"""
+ """Bytecode w/ source: simple"""
name = '__importlib_test_benchmark__'
with source_util.create_modules(name) as mapping:
py_compile.compile(mapping[name])
@@ -96,16 +123,32 @@ def source_using_bytecode(seconds, repeat):
yield result
+def decimal_using_bytecode(seconds, repeat):
+ """Bytecode w/ source: decimal"""
+ name = 'decimal'
+ py_compile.compile(decimal.__file__)
+ for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
+ seconds=seconds):
+ yield result
+
+
def main(import_):
__builtins__.__import__ = import_
- benchmarks = (from_cache, builtin_mod, source_using_bytecode,
- source_wo_bytecode, source_writing_bytecode,)
- print("Measuring imports/second\n")
+ benchmarks = (from_cache, builtin_mod,
+ source_using_bytecode, source_wo_bytecode,
+ source_writing_bytecode,
+ decimal_using_bytecode, decimal_writing_bytecode,
+ decimal_wo_bytecode,)
+ seconds = 1
+ seconds_plural = 's' if seconds > 1 else ''
+ repeat = 3
+ header = "Measuring imports/second over {} second{}, best out of {}\n"
+ print(header.format(seconds, seconds_plural, repeat))
for benchmark in benchmarks:
print(benchmark.__doc__, "[", end=' ')
sys.stdout.flush()
results = []
- for result in benchmark(seconds=1, repeat=3):
+ for result in benchmark(seconds=seconds, repeat=repeat):
results.append(result)
print(result, end=' ')
sys.stdout.flush()