]> git.donarmstrong.com Git - lilypond.git/blob - scripts/linux-time.py
patch::: 1.3.54.hwn2
[lilypond.git] / scripts / linux-time.py
1 #!@PYTHON@
2 # linux-time.py -- Print resourse usage of a command executing on GNU/Linux
3 #
4 # awaiting PC's linux-mm patch for getrusage
5 #
6 # source file of the GNU LilyPond music typesetter
7
8 # (c) 2000 Jan Nieuwenhuizen <janneke@gnu.org>
9
10
11 name = 'linux-time'
12 version = '@TOPLEVEL_VERSION@'
13 if version == '@' + 'TOPLEVEL_VERSION' + '@':
14         version = '(unknown version)'           # uGUHGUHGHGUGH
15   
16 import string
17 import getopt
18 import sys
19 import os
20 import time
21 import posix
22 import signal
23
24 def identify():
25         sys.stderr.write ("%s from LilyPond %s\n" % (name, version))
26
27 def help ():
28         print (r"""
29 Usage: %s [OPTION]... COMMAND
30
31 Print resourse usage of a command executing on GNU/Linux.
32
33 Options:
34   -h, --help          this help
35   -v, --version       version information
36 """ % name)
37
38 def print_version ():
39         print (r"""%s (GNU LilyPond) %s""" % (name, version))
40
41 (options, files) = getopt.getopt (sys.argv[1:], 'vh', ['help','version'])
42
43 for opt in options:
44         o = opt[0]
45         a = opt[1]
46         if o== '--help' or o == '-h':
47                 help ()
48                 sys.exit (0)
49         if o == '--version' or o == '-v':
50                 print_version ()
51                 sys.exit (0)
52         else:
53                 print o
54                 raise getopt.error
55
56 # identify ()
57
58 if len (files) < 1:
59         help ()
60         sys.exit (2)
61
62 #command = files[0]
63 #sys.system ("/usr/bin/time %s" % command)
64 pid = 0
65 status = 0
66 t = 0
67 avg_size = 0
68 max_size = 0
69 avg_rss = 0
70 max_rss = 0
71 INTERVAL = 0.1
72
73 # why doesn't it work when put in a function?
74 #def time ():
75 #       global status, t;
76 #       #child_pid = os.fork ()
77 #       child_pid = forkit ()
78 #       if child_pid:
79 #               #Parent
80 #               while 1:
81 #                       try:
82 #                               # AARg, wait takes only 1 argument,
83 #                               # but this still compiled
84 #                               #(pid, status) = os.wait (child_pid, os.WNOHANG)
85 #                               (pid, status) = os.waitpid (child_pid, os.WNOHANG)
86 #                               if not pid:
87 #                                       time.sleep (INTERVAL)
88 #                                       t = t + 1
89 #                                       print ("s: %d" % t)
90 #                       except:
91 #                               break
92 #       else:
93 #               # Child
94 #               status = os.system ("/usr/bin/time %s" % string.join (files, " "))
95 #               sys.exit (status)
96
97
98 if 0:
99         # cute, but this doesn't work: we get resources of /usr/bin/time
100         command = "/usr/bin/time"
101         args = files
102 else:
103         # we should do 'time' ourselves:
104         # man 5 proc
105         command = files[0]
106         args = files[1:]
107
108
109 child_pid = os.fork ()
110 if child_pid:
111         #Parent
112         statm = "/proc/%d/statm" % child_pid
113         while 1:
114                 try:
115                         # AARg, wait takes only 1 argument,
116                         # but this still compiled
117                         #(pid, status) = os.wait (child_pid, os.WNOHANG)
118                         (pid, status) = os.waitpid (child_pid, os.WNOHANG)
119                 except:
120                         break
121                 if pid:
122                         break
123
124                 time.sleep (INTERVAL)
125                 f = open (statm, "r")
126                 stats = f.readline ()
127                 f.close ()
128                 (size, rss, drie, vier, vijf, zes, zeven) = string.split (stats, " ")
129                 t = t + 1
130                 size = string.atoi (size)
131                 max_size = max (size, max_size)
132                 avg_size = avg_size + size
133                 rss = string.atoi (rss)
134                 max_rss = max (rss, max_rss)
135                 avg_rss = avg_rss + rss
136 else:
137         # Child
138         #status = os.system ("/usr/bin/time %s" % string.join (files, " "))
139         #sys.exit (status)
140         os.execvp (command, (command,) + tuple (args))
141
142
143 ms = max_size * 4.0/1024
144 mr = max_size * 4.0/1024
145 avg_size = avg_size / t
146 avg_rss = avg_rss / t
147 as = avg_size * 4.0/1024
148 ar = avg_rss * 4.0/1024
149 print ("MAXSIZE: %6.3fM(%d), MAXRSS: %6.3fM(%d)" % (ms, max_size, mr, max_rss))
150 print ("AVGSIZE: %6.3fM(%d), AVGRSS: %6.3fM(%d)" % (as, avg_size, ar, avg_rss))
151 sys.exit (status)