[pypy-svn] r58221 - in pypy/build/benchmem: . testing
hpk at codespeak.net
hpk at codespeak.net
Thu Sep 18 14:23:20 CEST 2008
Author: hpk
Date: Thu Sep 18 14:23:18 2008
New Revision: 58221
Modified:
pypy/build/benchmem/benchtool.py
pypy/build/benchmem/testing/test_benchtool.py
Log:
parse all data from smaps files, with tests.
Modified: pypy/build/benchmem/benchtool.py
==============================================================================
--- pypy/build/benchmem/benchtool.py (original)
+++ pypy/build/benchmem/benchtool.py Thu Sep 18 14:23:18 2008
@@ -1,5 +1,5 @@
import py
-import os, sys
+import os, sys, re
mydir = py.magic.autopath().dirpath()
benchmarkdir = mydir.join("benchmark")
@@ -76,6 +76,61 @@
self._file.write("\n")
self._file.write(self.SEPLINE)
self._file.flush()
+
+class SmapsMapping:
+ def __init__(self, headvars, bodyvars):
+ self.__dict__.update(headvars)
+ self.__dict__.update(bodyvars)
+ self.inode = int(self.inode)
+
+class SmapsReader(object):
+ # example '402c1000-402c2000 rw-p 00011000 1f:04 1110 /lib/libnsl-2.5.so'
+ headrex = re.compile(r"""
+ (?P<virtualaddress>\w+-\w+)\s+
+ (?P<mode>[rwxps-]+)\s+
+ (?P<page>\w+)\s+
+ (?P<dev>\w\w:\w\w)\s+
+ (?P<inode>\w+)\s+
+ (?P<filename>\S*)""",
+ re.VERBOSE)
+ # example 'Size: 4648 kB'
+ linerex = re.compile(r"(\S+):\s+(\d+)\skB")
+
+ def __init__(self, mappings):
+ self.mappings = mappings
+ for name in ("size rss shared_clean shared_dirty "
+ "private_clean private_dirty".split()):
+ setattr(self, name, sum([getattr(x, name) for x in mappings]))
+
+ @classmethod
+ def parse(cls, string):
+ lines = string.split("\n")
+ mappings = []
+ while lines:
+ line = lines.pop(0)
+ if not line.strip():
+ continue
+ m = cls.headrex.match(line)
+ if m is None:
+ print "ignoring", line
+ continue
+ headvars = m.groupdict()
+ bodyvars = {}
+ while lines:
+ line = lines.pop(0)
+ m = cls.linerex.match(line)
+ if m is None:
+ lines.insert(0, line)
+ mappings.append(SmapsMapping(headvars, bodyvars))
+ break
+ name, num = m.groups()
+ name = name.lower()
+ num = int(num) * 1024 # xxx get constant from somewhere?
+ assert name not in bodyvars
+ bodyvars[name] = num
+ else:
+ mappings.append(SmapsMapping(headvars, bodyvars))
+ return cls(mappings)
if __name__ == '__main__':
pass
Modified: pypy/build/benchmem/testing/test_benchtool.py
==============================================================================
--- pypy/build/benchmem/testing/test_benchtool.py (original)
+++ pypy/build/benchmem/testing/test_benchtool.py Thu Sep 18 14:23:18 2008
@@ -1,7 +1,7 @@
import py
import os, sys
-from benchtool import SmapsRecorder, BenchRunner, benchmarkdir
+import benchtool
def setup_module(mod):
if sys.platform.find("linux") == -1:
@@ -11,23 +11,147 @@
tmpdir = py.test.ensuretemp("smapsrecorder")
logpath = tmpdir.join("logfile")
pid = os.getpid()
- rec = SmapsRecorder(pid=pid, logpath=logpath)
+ rec = benchtool.SmapsRecorder(pid=pid, logpath=logpath)
s = logpath.read()
- assert s.count(SmapsRecorder.SEPLINE) == 1
+ assert s.count(benchtool.SmapsRecorder.SEPLINE) == 1
rec.snapshot()
rec.snapshot()
del rec
s = logpath.read()
- assert s.count(SmapsRecorder.SEPLINE) == 3
+ assert s.count(benchtool.SmapsRecorder.SEPLINE) == 3
def test_benchrunner():
tmpdir = py.test.ensuretemp("benchrunner")
- runner = BenchRunner(executable="python2.5", resultdir=tmpdir)
+ runner = benchtool.BenchRunner(executable="python2.5", resultdir=tmpdir)
def checker(name, *args):
smapsfile = runner.run_checkpointed_bench(name, args)
assert smapsfile.check()
- for name in benchmarkdir.listdir("*.py"):
+ for name in benchtool.benchmarkdir.listdir("*.py"):
if name.basename[0] != "_":
yield checker, name.basename, 10, 10
+class TestSmapsReader:
+ def setup_class(cls):
+ cls.s = py.std.textwrap.dedent("""\
+ 08048000-0813f000 r-xp 00000000 fd:00 75457 sometext
+ Size: 988 kB
+ Rss: 796 kB
+ Shared_Clean: 0 kB
+ Shared_Dirty: 0 kB
+ Private_Clean: 796 kB
+ Private_Dirty: 0 kB
+ 402c2000-402c4000 rw-p 402c2000 00:00 0
+ Size: 16 kB
+ Rss: 8 kB
+ Shared_Clean: 0 kB
+ Shared_Dirty: 0 kB
+ Private_Clean: 0 kB
+ Private_Dirty: 8 kB""")
+
+ def test_parse_mappings(self):
+ smapsreader = benchtool.SmapsReader.parse(self.s)
+ mappings = smapsreader.mappings
+ assert len(mappings) == 2
+ mapping = mappings[0]
+ assert mapping.virtualaddress == "08048000-0813f000"
+ assert mapping.mode == "r-xp"
+ assert mapping.dev == "fd:00"
+ assert mapping.inode == 75457
+ assert mapping.filename == "sometext"
+ assert mapping.size == 988 * 1024
+ assert mapping.rss == 796 * 1024
+ assert mapping.shared_clean == 0
+ assert mapping.shared_dirty == 0
+ assert mapping.private_clean == 796 * 1024
+ assert mapping.private_dirty == 0
+ #assert mapping.referenced is None
+
+ mapping = mappings[1]
+ assert mapping.virtualaddress == "402c2000-402c4000"
+ assert mapping.mode == "rw-p"
+ assert mapping.dev == "00:00"
+ assert mapping.inode == 0
+ assert not mapping.filename
+ assert mapping.size == 16 * 1024
+ assert mapping.rss == 8 * 1024
+ assert mapping.shared_clean == 0
+ assert mapping.shared_dirty == 0
+ assert mapping.private_clean == 0
+ assert mapping.private_dirty == 8 * 1024
+ #assert mapping.referenced == 12 * 1024
+
+ def test_summing(self):
+ smaps = benchtool.SmapsReader.parse(self.s)
+ for name in ('size rss shared_clean shared_dirty '
+ 'private_clean private_dirty').split():
+ sumval = getattr(smaps, name)
+ val1 = getattr(smaps.mappings[0], name)
+ val2 = getattr(smaps.mappings[1], name)
+ assert sumval == val1 + val2
+
+example_data2 = '''
+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
+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
+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
+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
+'''
+
+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