[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