File: loopcounter.py

package info (click to toggle)
pypy3 7.3.19%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 212,236 kB
  • sloc: python: 2,098,316; ansic: 540,565; sh: 21,462; asm: 14,419; cpp: 4,451; makefile: 4,209; objc: 761; xml: 530; exp: 499; javascript: 314; pascal: 244; lisp: 45; csh: 12; awk: 4
file content (51 lines) | stat: -rwxr-xr-x 1,644 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python
"""
Parse and display the traces produced by pypy-c-jit when PYPYLOG is set.
"""
from __future__ import print_function

import sys
import optparse
import re

def get_timestamp(line):
    match = re.match(r'\[([0-9a-f]*)\] .*', line)
    return int(match.group(1), 16)

def count_loops_and_bridges(log):
    loops = 0
    bridges = 0
    time0 = None
    lines = iter(log)
    for line in lines:
        if time0 is None and line.startswith('['):
            time0 = get_timestamp(line)
        if '{jit-mem-looptoken-' in line:
            time_now = get_timestamp(line) - time0
            text = lines.next()
            if text.startswith('allocating Loop #'):
                loops += 1
            elif text.startswith('allocating Bridge #'):
                bridges += 1
            elif text.startswith('freeing Loop #'):
                match = re.match('freeing Loop # .* with ([0-9]*) attached bridges\n', text)
                loops -=1
                bridges -= int(match.group(1))
            else:
                assert False, 'unknown line' % line
            total = loops+bridges
            yield (time_now, total, loops, bridges)

def main(logfile, options):
    print('timestamp,total,loops,bridges')
    log = open(logfile)
    for timestamp, total, loops, bridges in count_loops_and_bridges(log):
        print('%d,%d,%d,%d' % (timestamp, total, loops, bridges))

if __name__ == '__main__':
    parser = optparse.OptionParser(usage="%prog loopfile [options]")
    options, args = parser.parse_args()
    if len(args) != 1:
        parser.print_help()
        sys.exit(2)
    main(args[0], options)