diff options
| author | Jason Madden <jamadden@gmail.com> | 2020-04-02 10:35:51 -0500 |
|---|---|---|
| committer | Jason Madden <jamadden@gmail.com> | 2020-04-02 10:35:51 -0500 |
| commit | 719851072c41ff0914def1368716a049859ed32a (patch) | |
| tree | aa4356dedbcb8f1702df92dbd4397fdb8a240332 | |
| parent | a4ed0566f9dd9cd65af39576f6c8fdeb252d1ea9 (diff) | |
| download | zope-interface-issue200.tar.gz | |
More micro benchmarks.issue200
Comparing to current master, there is no substantial difference.
+-------------------------------------------------------------+----------------+------------------------------+
| Benchmark | bench_master38 | bench_issue200 |
+=============================================================+================+==============================+
| call interface (alternate, no conform, not provided) | 395 ns | 414 ns: 1.05x slower (+5%) |
+-------------------------------------------------------------+----------------+------------------------------+
| call interface (no alternate, valid conform, not provided) | 250 ns | 240 ns: 1.04x faster (-4%) |
+-------------------------------------------------------------+----------------+------------------------------+
| read __module__ | 45.3 ns | 43.4 ns: 1.04x faster (-4%) |
+-------------------------------------------------------------+----------------+------------------------------+
| query adapter (no registrations) | 3.23 ms | 3.31 ms: 1.02x slower (+2%) |
+-------------------------------------------------------------+----------------+------------------------------+
| query adapter (all trivial registrations) | 3.93 ms | 4.40 ms: 1.12x slower (+12%) |
+-------------------------------------------------------------+----------------+------------------------------+
| query adapter (all trivial registrations, wide inheritance) | 43.3 us | 45.5 us: 1.05x slower (+5%) |
+-------------------------------------------------------------+----------------+------------------------------+
| query adapter (all trivial registrations, deep inheritance) | 43.2 us | 46.9 us: 1.09x slower (+9%) |
+-------------------------------------------------------------+----------------+------------------------------+
| sort mixed | 361 us | 354 us: 1.02x faster (-2%) |
+-------------------------------------------------------------+----------------+------------------------------+
| contains (populated dict: interfaces) | 61.3 ns | 59.7 ns: 1.03x faster (-3%) |
+-------------------------------------------------------------+----------------+------------------------------+
Not significant (13): call interface (provides; deep); call interface (provides; wide); call interface (no alternate, no conform, not provided); call interface (alternate, invalid conform, not provided); read __name__; read __doc__; read providedBy; sort interfaces; sort implementedBy; contains (empty dict); contains (populated list: interfaces); contains (populated dict: implementedBy); contains (populated list: implementedBy)
| -rw-r--r-- | benchmarks/micro.py | 118 |
1 files changed, 116 insertions, 2 deletions
diff --git a/benchmarks/micro.py b/benchmarks/micro.py index a9527db..dce40ce 100644 --- a/benchmarks/micro.py +++ b/benchmarks/micro.py @@ -37,6 +37,21 @@ class DeepestInheritance(object): pass classImplements(DeepestInheritance, deep_ifaces[-1]) + +class ImplementsNothing(object): + pass + + +class HasConformReturnNone(object): + def __conform__(self, iface): + return None + + +class HasConformReturnObject(object): + def __conform__(self, iface): + return self + + def make_implementer(iface): c = type('Implementer' + iface.__name__, (object,), {}) classImplements(c, iface) @@ -77,16 +92,17 @@ def bench_sort(loops, objs): return pyperf.perf_counter() - t0 def bench_query_adapter(loops, components, objs=providers): + components_queryAdapter = components.queryAdapter # One time through to prime the caches for iface in ifaces: for provider in providers: - components.queryAdapter(provider, iface) + components_queryAdapter(provider, iface) t0 = pyperf.perf_counter() for _ in range(loops): for iface in ifaces: for provider in objs: - components.queryAdapter(provider, iface) + components_queryAdapter(provider, iface) return pyperf.perf_counter() - t0 @@ -106,9 +122,107 @@ def bench_getattr(loops, name, get=getattr): get(Interface, name) # 10 return pyperf.perf_counter() - t0 + +def bench_iface_call_no_conform_no_alternate_not_provided(loops): + inst = ImplementsNothing() + t0 = pyperf.perf_counter() + for _ in range(loops): + for _ in range(INNER): + for iface in ifaces: + try: + iface(inst) + except TypeError: + pass + else: + raise TypeError("Should have failed") + return pyperf.perf_counter() - t0 + + +def bench_iface_call_no_conform_w_alternate_not_provided(loops): + inst = ImplementsNothing() + t0 = pyperf.perf_counter() + for _ in range(loops): + for _ in range(INNER): + for iface in ifaces: + iface(inst, 42) + return pyperf.perf_counter() - t0 + + +def bench_iface_call_w_conform_return_none_not_provided(loops): + inst = HasConformReturnNone() + t0 = pyperf.perf_counter() + for _ in range(loops): + for _ in range(INNER): + for iface in ifaces: + iface(inst, 42) + return pyperf.perf_counter() - t0 + + +def bench_iface_call_w_conform_return_non_none_not_provided(loops): + inst = HasConformReturnObject() + t0 = pyperf.perf_counter() + for _ in range(loops): + for _ in range(INNER): + for iface in ifaces: + iface(inst) + return pyperf.perf_counter() - t0 + +def _bench_iface_call_simple(loops, inst): + t0 = pyperf.perf_counter() + for _ in range(loops): + for _ in range(INNER): + for iface in ifaces: + iface(inst) + return pyperf.perf_counter() - t0 + + +def bench_iface_call_no_conform_provided_wide(loops): + return _bench_iface_call_simple(loops, WideInheritance()) + + +def bench_iface_call_no_conform_provided_deep(loops): + return _bench_iface_call_simple(loops, DeepestInheritance()) + + runner = pyperf.Runner() runner.bench_time_func( + 'call interface (provides; deep)', + bench_iface_call_no_conform_provided_deep, + inner_loops=INNER * len(ifaces) +) + +runner.bench_time_func( + 'call interface (provides; wide)', + bench_iface_call_no_conform_provided_wide, + inner_loops=INNER * len(ifaces) +) + +runner.bench_time_func( + 'call interface (no alternate, no conform, not provided)', + bench_iface_call_no_conform_no_alternate_not_provided, + inner_loops=INNER * len(ifaces) +) + +runner.bench_time_func( + 'call interface (alternate, no conform, not provided)', + bench_iface_call_no_conform_w_alternate_not_provided, + inner_loops=INNER * len(ifaces) +) + +runner.bench_time_func( + 'call interface (no alternate, valid conform, not provided)', + bench_iface_call_w_conform_return_non_none_not_provided, + inner_loops=INNER * len(ifaces) +) + +runner.bench_time_func( + 'call interface (alternate, invalid conform, not provided)', + bench_iface_call_w_conform_return_none_not_provided, + inner_loops=INNER * len(ifaces) +) + +runner.bench_time_func( 'read __module__', # stored in C, accessed through __getattribute__ bench_getattr, '__module__', |
