[pypy-svn] r57904 - in pypy/branch/cross-compilation/pypy/translator/benchmark: . test

fijal at codespeak.net fijal at codespeak.net
Sat Sep 6 21:04:33 CEST 2008


Author: fijal
Date: Sat Sep  6 21:04:29 2008
New Revision: 57904

Modified:
   pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py
   pypy/branch/cross-compilation/pypy/translator/benchmark/test/test_bench_mem.py
Log:
* Make tests more robust agains timing
* Adapt a script, it's almost usable by now


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 21:04:29 2008
@@ -1,8 +1,12 @@
 #!/usr/bin/env python
+""" Usage: bench_mem.py program_name [arg0] [arg1] ...
+"""
 import os
 import py
 import time
 import re
+import signal
+import sys
 
 class Result(object):
     def __init__(self, priv_map, shared_map, starttime=None):
@@ -16,14 +20,14 @@
         self.private = sum(priv_map.values())
         self.shared = sum(shared_map.values())
         
-def parse_pmap_output(raw_data):
+def parse_smaps_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]
+    lines = [i for i in raw_data.split('\n')[:-1] if i]
     priv_map = {}
     shared_map = {}
     num = 0
@@ -35,21 +39,48 @@
         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
+        if shared:
             shared_map[name] = shared + shared_map.get(name, 0)
         num += 8
     return Result(priv_map, shared_map)
 
+class ChildProcess(object):
+    realos = os
+    
+    def __init__(self, name, args):
+        self.pid = run_child(name, args)
+
+    def loop(self, logfile, interval):
+        if isinstance(logfile, basestring):
+            logfile = open(logfile, 'w')
+        counter = 0
+        while 1:
+            try:
+                res = parse_smaps_output(open('/proc/%d/smaps' % self.pid).read())
+                print >>logfile, counter, ' ', res.private
+            except IOError:
+                self.close()
+                return
+            counter += 1
+            time.sleep(interval)
+
+    def close(self):
+        if self.pid:
+            self.realos.waitpid(self.pid, 0)
+
+    def __del__(self):
+        self.close()
+
 def run_child(name, args):
     pid = os.fork()
     if not pid:
         os.execvp(name, [name] + args)
-    else:
-        res = py.process.cmdexec('pmap -x %d' % pid)
-    return res
+    return pid
 
 if __name__ == '__main__':
-    run_child('python', ['-c', 'pass'])
+    if len(sys.argv) < 2:
+        print __doc__
+        sys.exit(1)
+    cp = ChildProcess(sys.argv[1], sys.argv[2:])
+    cp.loop(sys.stdout, 0.1)

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 21:04:29 2008
@@ -1,12 +1,18 @@
 
 from pypy.translator.benchmark import bench_mem
+import time
 
-def test_basic():
-    res = bench_mem.run_child('python', ['-c', 'pass'])
-    assert 'python' in res
+def test_compute_memory_usage():
+    pid = bench_mem.run_child('python', ['-c', 'import time;time.sleep(1)'])
+    time.sleep(.3)
+    assert pid
+    res = open('/proc/%d/smaps' % pid).read()
+    parsed = bench_mem.parse_smaps_output(res)
+    assert parsed.shared
+    assert parsed.private
 
 def test_parse():
-    res = bench_mem.parse_pmap_output(example_data)
+    res = bench_mem.parse_smaps_output(example_data)
     assert res.private == 796 + 120 + 924
     assert res.shared == 60
     assert res.priv_map == {



More information about the Pypy-commit mailing list