Created
August 22, 2018 18:53
-
-
Save jamadden/ed13f763f1c7c4a5ebd4ee7ca21cf64d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
""" | |
from __future__ import absolute_import | |
from __future__ import division | |
from __future__ import print_function | |
import perf | |
from ZODB.utils import p64 | |
from ZODB.utils import u64 | |
import struct | |
INNER_LOOPS = 1000 | |
def current_both(loops): | |
begin = perf.perf_counter() | |
for _ in range(loops): | |
for _ in range(INNER_LOOPS): | |
u64(p64(123456789)) | |
end = perf.perf_counter() | |
return end - begin | |
OID_STRUCT = struct.Struct(">Q") | |
struct_pack = OID_STRUCT.pack | |
struct_unpack = OID_STRUCT.unpack | |
def cached_struct_directly(loops): | |
begin = perf.perf_counter() | |
for _ in range(loops): | |
for _ in range(INNER_LOOPS): | |
struct_unpack(struct_pack(123456789)) | |
end = perf.perf_counter() | |
return end - begin | |
def struct_unpack_real(i): | |
return struct_unpack(i)[0] | |
def cached_struct_pack_directly_unpack_function(loops): | |
begin = perf.perf_counter() | |
for _ in range(loops): | |
for _ in range(INNER_LOOPS): | |
struct_unpack_real(struct_pack(123456789)) | |
end = perf.perf_counter() | |
return end - begin | |
def struct_pack_tbinfo(i): | |
__traceback_info__ = i | |
return struct_pack(i) | |
def struct_pack_catch(i): | |
try: | |
return struct_pack(i) | |
except struct.error: | |
raise TypeError() | |
def cached_struct_pack_tbinfo(loops): | |
begin = perf.perf_counter() | |
for _ in range(loops): | |
for _ in range(INNER_LOOPS): | |
struct_unpack_real(struct_pack_tbinfo(123456789)) | |
end = perf.perf_counter() | |
return end - begin | |
def cached_struct_pack_exc(loops): | |
begin = perf.perf_counter() | |
for _ in range(loops): | |
for _ in range(INNER_LOOPS): | |
struct_unpack_real(struct_pack_catch(123456789)) | |
end = perf.perf_counter() | |
return end - begin | |
def main(): | |
runner = perf.Runner() | |
runner.bench_time_func('current: u64(p64())', | |
current_both, inner_loops=INNER_LOOPS) | |
runner.bench_time_func('struct method direct: u64(p64())', | |
cached_struct_directly, inner_loops=INNER_LOOPS) | |
runner.bench_time_func('struct pack direct unpack indirect: u64(p64())', | |
cached_struct_pack_directly_unpack_function, | |
inner_loops=INNER_LOOPS) | |
runner.bench_time_func('struct pack tbinfo unpack indirect: u64(p64())', | |
cached_struct_pack_tbinfo, inner_loops=INNER_LOOPS) | |
runner.bench_time_func('struct pack catch unpack indirect: u64(p64())', | |
cached_struct_pack_exc, inner_loops=INNER_LOOPS) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment