[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