~linaro-toolchain-dev/cortex-strings/trunk

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
import ctypes
import timeit
import pprint
import gc
import math

plain = ctypes.cdll.LoadLibrary("install/lib/libplain.so")
libc = ctypes.cdll.LoadLibrary("/lib/libc.so.6")
bionic = ctypes.cdll.LoadLibrary("install/lib/libbionic.so")
glibc = ctypes.cdll.LoadLibrary("install/lib/libglibc.so")
newlib = ctypes.cdll.LoadLibrary("install/lib/libnewlib.so")
helpers = ctypes.cdll.LoadLibrary("install/lib/libhelpers.so")

dest = ctypes.create_string_buffer(1024*1024)
src = ctypes.create_string_buffer(('\x55' * 13) + '\0', 1024*1024)

overhead = 0

def round2(v):
    base = 10**(int(math.log10(v)))
    return int(v/base + 1) * base

def run(fun):
    timer = timeit.default_timer
    gcold = gc.isenabled()
    gc.disable()

    t0 = timer()
    fun()
    t1 = timer()

    if gcold:
        gc.enable()

    elapsed = t1 - t0

    return elapsed

# Calculate a good number of loops
loops = 100000

while True:
    elapsed = run(lambda: helpers.spawniis(plain.memcpy, loops, dest, src, 20))

    if elapsed < 0.1:
        loops *= 10
    else:
        loops = round2(loops*2/elapsed)
        print loops
        break

limit = 512*1024
step = 2
last = None

#small = range(4096, limit, 4096)
big = [int(step**x) for x in range(1, int(math.log(limit)/math.log(step)+1))]
big = []
small = range(1, 3)
steps = sorted(list(set(big) | set(small)))

print steps

for size in steps:
    if size >= 8:
        l = round2(int(loops*30/size))
    else:
        l = loops

    # tests = [
    #     lambda: helpers.spawniis(helpers.bounce, l, dest, src, size),
    #     lambda: helpers.spawniis(plain.memcpy, l, dest, src, size),
    #     lambda: helpers.spawniis(plain.memcpy2, l, dest, src, size),
    #     lambda: helpers.spawniis(libc.memcpy, l, dest, src, size),
    #     lambda: helpers.spawniis(glibc.memcpy, l, dest, src, size),
    #     lambda: helpers.spawniis(bionic.memcpy, l, dest, src, size),
    #     ]
    # tests = [
    #     lambda: helpers.spawniis(helpers.bounce, l, dest, src, size),
    #     lambda: helpers.spawniis(libc.strcpy, l, dest, src, size),
    #     lambda: helpers.spawniis(newlib.strcpy, l, dest, src, size)
    #     ]
    tests = [
        lambda: helpers.spawniis(helpers.bounce, l, dest, src, size),
        lambda: helpers.spawniis(libc.strlen, l, src, src, size),
        lambda: helpers.spawniis(glibc.strlen, l, src, src, size),
        lambda: helpers.spawniis(bionic.strlen, l, src, src, size),
        lambda: helpers.spawniis(newlib.strlen, l, src, src, size),
        ]

    results = [size, l] + [run(x) for x in tests]
    print '\t'.join('%s' % x for x in results)