Skip to content

Instantly share code, notes, and snippets.

@jamadden
Created August 22, 2018 18:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jamadden/ed13f763f1c7c4a5ebd4ee7ca21cf64d to your computer and use it in GitHub Desktop.
Save jamadden/ed13f763f1c7c4a5ebd4ee7ca21cf64d to your computer and use it in GitHub Desktop.
# -*- 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