]> arthur.barton.de Git - bup.git/blob - memtest.py
cmd-join: don't restart git cat-file so frequently.
[bup.git] / memtest.py
1 #!/usr/bin/env python
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 ignore-midx  ignore .midx files, use only .idx files
32 """
33 o = options.Options(sys.argv[0], optspec)
34 (opt, flags, extra) = o.parse(sys.argv[1:])
35
36 if extra:
37     o.usage()
38
39 git.ignore_midx = opt.ignore_midx
40
41 git.check_repo_or_die()
42 m = git.MultiPackIndex(git.repo('objects/pack'))
43
44 cycles = opt.cycles or 100
45 number = opt.number or 10000
46
47 report(-1)
48 f = open('/dev/urandom')
49 a = mmap.mmap(-1, 20)
50 report(0)
51 for c in xrange(cycles):
52     for n in xrange(number):
53         b = f.read(3)
54         if 0:
55             bytes = list(struct.unpack('!BBB', b)) + [0]*17
56             bytes[2] &= 0xf0
57             bin = struct.pack('!20s', s_from_bytes(bytes))
58         else:
59             a[0:2] = b[0:2]
60             a[2] = chr(ord(b[2]) & 0xf0)
61             bin = str(a[0:20])
62         #print bin.encode('hex')
63         m.exists(bin)
64     report((c+1)*number)