[pypy-svn] r57902 - in pypy/branch/cross-compilation/pypy/translator/benchmark: . test
fijal at codespeak.net
fijal at codespeak.net
Sat Sep 6 20:38:20 CEST 2008
Author: fijal
Date: Sat Sep 6 20:38:19 2008
New Revision: 57902
Modified:
pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py
pypy/branch/cross-compilation/pypy/translator/benchmark/test/test_bench_mem.py
Log:
Parse /proc/$pid/smaps output (once)
Modified: pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py
==============================================================================
--- pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py (original)
+++ pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py Sat Sep 6 20:38:19 2008
@@ -1,13 +1,54 @@
#!/usr/bin/env python
import os
import py
+import time
+import re
+
+class Result(object):
+ def __init__(self, priv_map, shared_map, starttime=None):
+ if starttime is None:
+ starttime = time.time()
+ self._compute_total(priv_map, shared_map)
+ self.priv_map = priv_map
+ self.shared_map = shared_map
+
+ def _compute_total(self, priv_map, shared_map):
+ self.private = sum(priv_map.values())
+ self.shared = sum(shared_map.values())
+
+def parse_pmap_output(raw_data):
+ def number(line):
+ m = re.search('(\d+) kB', line)
+ if not m:
+ raise ValueError("Wrong line: %s" % (line,))
+ return int(m.group(1))
+
+ lines = raw_data.split('\n')[1:-1]
+ priv_map = {}
+ shared_map = {}
+ num = 0
+ while num < len(lines):
+ m = re.search('(\S+)\s*$', lines[num])
+ if not m:
+ raise ValueError("Wrong line " + lines[num])
+ name = m.group(1)
+ priv = number(lines[num + 5]) + number(lines[num + 6])
+ shared = number(lines[num + 3]) + number(lines[num + 4])
+ if priv:
+ assert not shared
+ priv_map[name] = priv + priv_map.get(name, 0)
+ else:
+ assert shared
+ shared_map[name] = shared + shared_map.get(name, 0)
+ num += 8
+ return Result(priv_map, shared_map)
def run_child(name, args):
pid = os.fork()
if not pid:
os.execvp(name, [name] + args)
else:
- res = py.process.cmdexec('pmap -d %d' % pid)
+ res = py.process.cmdexec('pmap -x %d' % pid)
return res
if __name__ == '__main__':
Modified: pypy/branch/cross-compilation/pypy/translator/benchmark/test/test_bench_mem.py
==============================================================================
--- pypy/branch/cross-compilation/pypy/translator/benchmark/test/test_bench_mem.py (original)
+++ pypy/branch/cross-compilation/pypy/translator/benchmark/test/test_bench_mem.py Sat Sep 6 20:38:19 2008
@@ -4,3 +4,50 @@
def test_basic():
res = bench_mem.run_child('python', ['-c', 'pass'])
assert 'python' in res
+
+def test_parse():
+ res = bench_mem.parse_pmap_output(example_data)
+ assert res.private == 796 + 120 + 924
+ assert res.shared == 60
+ assert res.priv_map == {
+ '/usr/bin/python2.5': 796 + 120,
+ '[heap]' : 924,
+ }
+ assert res.shared_map == {
+ '/lib/libncurses.so.5.6' : 60,
+ }
+
+example_data = '''
+08048000-0813f000 r-xp 00000000 fd:00 75457 /usr/bin/python2.5
+Size: 988 kB
+Rss: 796 kB
+Shared_Clean: 0 kB
+Shared_Dirty: 0 kB
+Private_Clean: 796 kB
+Private_Dirty: 0 kB
+Referenced: 796 kB
+0813f000-08164000 rw-p 000f6000 fd:00 75457 /usr/bin/python2.5
+Size: 148 kB
+Rss: 120 kB
+Shared_Clean: 0 kB
+Shared_Dirty: 0 kB
+Private_Clean: 12 kB
+Private_Dirty: 108 kB
+Referenced: 120 kB
+08164000-0825c000 rw-p 08164000 00:00 0 [heap]
+Size: 992 kB
+Rss: 924 kB
+Shared_Clean: 0 kB
+Shared_Dirty: 0 kB
+Private_Clean: 0 kB
+Private_Dirty: 924 kB
+Referenced: 924 kB
+b7baf000-b7beb000 r-xp 00000000 08:01 218 /lib/libncurses.so.5.6
+Size: 240 kB
+Rss: 60 kB
+Shared_Clean: 60 kB
+Shared_Dirty: 0 kB
+Private_Clean: 0 kB
+Private_Dirty: 0 kB
+Referenced: 60 kB
+'''
More information about the Pypy-commit
mailing list