[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