]> arthur.barton.de Git - bup.git/blob - memtest.py
memtest.py: a standalone program for testing memory usage in PackIndex.
[bup.git] / memtest.py
1 #!/usr/bin/env python2.5
2 import sys, re, struct, mmap
3 import git, options
4 from helpers import *
5
6
7 def s_from_bytes(bytes):
8     clist = [chr(b) for b in bytes]
9     return ''.join(clist)
10
11
12 def report(count):
13     fields = ['VmSize', 'VmRSS', 'VmData', 'VmStk']
14     d = {}
15     for line in open('/proc/self/status').readlines():
16         l = re.split(r':\s*', line.strip(), 1)
17         d[l[0]] = l[1]
18     if count >= 0:
19         e1 = count
20         fields = [d[k] for k in fields]
21     else:
22         e1 = ''
23     print ('%9s  ' + ('%10s ' * len(fields))) % tuple([e1] + fields)
24
25
26 optspec = """
27 memtest [-n elements] [-c cycles]
28 --
29 n,number=  number of objects per cycle
30 c,cycles=  number of cycles to run
31 """
32 o = options.Options(sys.argv[0], optspec)
33 (opt, flags, extra) = o.parse(sys.argv[1:])
34
35 if extra:
36     o.usage()
37
38 git.check_repo_or_die()
39 m = git.MultiPackIndex(git.repo('objects/pack'))
40
41 cycles = opt.cycles or 100
42 number = opt.number or 10000
43
44 report(-1)
45 f = open('/dev/urandom')
46 a = mmap.mmap(-1, 20)
47 report(0)
48 for c in xrange(cycles):
49     for n in xrange(number):
50         b = f.read(3)
51         if 0:
52             bytes = list(struct.unpack('!BBB', b)) + [0]*17
53             bytes[2] &= 0xf0
54             bin = struct.pack('!20s', s_from_bytes(bytes))
55         else:
56             a[0:2] = b[0:2]
57             a[2] = chr(ord(b[2]) & 0xf0)
58             bin = str(a[0:20])
59         #print bin.encode('hex')
60         m.exists(bin)
61     report((c+1)*number)