File: bench_get_memory.py

package info (click to toggle)
python-gevent 24.11.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,364 kB
  • sloc: python: 138,768; ansic: 87,807; sh: 12,548; makefile: 2,379; javascript: 108
file content (101 lines) | stat: -rw-r--r-- 2,732 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
"""
Benchmarking for getting the memoryview of an object.

https://github.com/gevent/gevent/issues/1318
"""
from __future__ import print_function

# pylint:disable=unidiomatic-typecheck

try:
    xrange
except NameError:
    xrange = range

try:
    buffer
except NameError:
    buffer = memoryview

import perf

from gevent._greenlet_primitives import get_memory as cy_get_memory

def get_memory_gevent14(data):
    try:
        mv = memoryview(data)
        if mv.shape:
            return mv
        # No shape, probably working with a ctypes object,
        # or something else exotic that supports the buffer interface
        return mv.tobytes()
    except TypeError:
        # fixes "python2.7 array.array doesn't support memoryview used in
        # gevent.socket.send" issue
        # (http://code.google.com/p/gevent/issues/detail?id=94)
        return buffer(data)

def get_memory_is(data):
    try:
        mv = memoryview(data) if type(data) is not memoryview else data
        if mv.shape:
            return mv
        # No shape, probably working with a ctypes object,
        # or something else exotic that supports the buffer interface
        return mv.tobytes()
    except TypeError:
        # fixes "python2.7 array.array doesn't support memoryview used in
        # gevent.socket.send" issue
        # (http://code.google.com/p/gevent/issues/detail?id=94)
        return buffer(data)

def get_memory_inst(data):
    try:
        mv = memoryview(data) if not isinstance(data, memoryview) else data
        if mv.shape:
            return mv
        # No shape, probably working with a ctypes object,
        # or something else exotic that supports the buffer interface
        return mv.tobytes()
    except TypeError:
        # fixes "python2.7 array.array doesn't support memoryview used in
        # gevent.socket.send" issue
        # (http://code.google.com/p/gevent/issues/detail?id=94)
        return buffer(data)


N = 100

DATA = {
    'bytestring': b'abc123',
    'bytearray': bytearray(b'abc123'),
    'memoryview': memoryview(b'abc123'),
}


def test(loops, func, arg):
    t0 = perf.perf_counter()
    for __ in range(loops):
        for _ in xrange(N):
            func(arg)
    return perf.perf_counter() - t0


def main():
    runner = perf.Runner()
    for func, name in (
            (get_memory_gevent14, 'gevent14-py'),
            (cy_get_memory, 'inst-cy'),
            (get_memory_inst, 'inst-py'),
            (get_memory_is, 'is-py'),
    ):
        for arg_name, arg in DATA.items():
            runner.bench_time_func(
                '%s - %s' % (name, arg_name),
                test, func, arg,
                inner_loops=N
            )


if __name__ == '__main__':
    main()