source: CMT/v1r25-branch/mgr/cmt-make-time-sub-mem-io.awk @ 664

Last change on this file since 664 was 664, checked in by rybkin, 10 years ago

merge -r 646:663 HEAD

  • Property svn:executable set to *
File size: 4.0 KB
Line 
1#! /usr/bin/awk -f
2#
3# Profile CMT commands utilisation in the Makefiles
4#
5# Usage:
6#
7# export VERBOSE=1
8# export TIME="%U user %S system %e elapsed %P CPU %C (%Xtext+%Ddata %Mmax)k %Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps %cswitch %wswitch voluntarily"
9#
10# \time cmt br make -j1 cmtexe="'\time ${CMTROOT}/${CMTBIN}/cmt.exe'" >&cmt-br-make-time.log&
11# OR
12# \time cmt br make -j1 cmtexe="'\time ${CMTROOT}/${CMTBIN}/cmt.exe'" cpp="'\time c++'" cc="'\time cc'" make_shlib="'\time ${CMTROOT}/mgr/cmt_make_shlib_common.sh extract'" >&cmt-br-make-time.log&
13#
14# ./cmt-make-time-sub-mem-io.awk cmt-br-make-time.log
15#
16$2 == "user" && $4 == "system" && $6 == "elapsed" {
17#if ($9 == "g++") {
18  if ($9 ~ /([gc]\+\+|g?cc)$/) {
19    gxx_u += $1; gxx_s += $3; gxx_e += $5; gxx_i += 1
20    if ($0 ~ /-MM/) {
21      dep_u += $1; dep_s += $3; dep_e += $5; dep_i += 1
22    }
23  }
24  else if ($9 ~ /cmt_make_shlib_common\.sh$/) {
25    make_shlib_u += $1; make_shlib_s += $3; make_shlib_e += $5; make_shlib_i += 1
26  }
27  else if ($9 ~ /\/CMT\/(v[[:digit:]]+(r[[:digit:]]+)?(p[[:digit:]]+)?)|HEAD\//) {
28    cmt_tot_u += $1; cmt_tot_s += $3; cmt_tot_e += $5; cmt_tot_i += 1
29    if ($0 ~ /-f=.+/) fast=1
30    else fast=0
31    for (i=10; i<=NF; i++) {
32      if ($i ~ /-.+/) continue
33      k=$i" "$(i+1)
34      if (fast == 1) {
35        cmt_f_u[k] += $1; cmt_f_s[k] += $3; cmt_f_e[k] += $5; cmt_f_i[k] += 1
36      }
37      else {
38        cmt_u[k] += $1; cmt_s[k] += $3; cmt_e[k] += $5; cmt_i[k] += 1
39      }
40      break
41    }
42# Maximum resident set size of the process during its lifetime, in Kilobytes
43    _rss_max = $(NF - 6)
44    sub("max)k", "", _rss_max)
45    rss_max += _rss_max
46    rss_max_i += 1
47
48    _major = gensub(/\(([[:digit:]]+)major\+([[:digit:]]+)minor\)pagefaults/, "\\1", "1", $(NF - 4))
49    _minor = gensub(/\(([[:digit:]]+)major\+([[:digit:]]+)minor\)pagefaults/, "\\2", "1", $(NF - 4))
50    major_pf += _major
51    minor_pf += _minor
52
53    cswitch += gensub(/([[:digit:]]+)switch/, "\\1", "1", $(NF - 2))
54    wswitch += gensub(/([[:digit:]]+)switch/, "\\1", "1", $(NF - 1))
55  }
56#  else
57#    print "Ignoring command: "$9
58}
59function prec (val)
60{
61  if (val >= 100) return 0
62  else if (val >= 10) return 1
63  else return 2
64}
65END {
66  printf "\nFile(s):"
67  for (i = 1; i < ARGC; i++) {
68    if (ARGV[i] ~ /^(_|[[:alpha:]])_*[[:alpha:]]*[[:digit:]]*=/) continue
69    printf " %s", ARGV[i]
70  }
71  printf "\n"
72
73  if (make_shlib_i != 0)
74    printf "cmt_make_shlib_common.sh[%d]: %.*f user %.*f system %.*f elapsed\n" \
75      , make_shlib_i, prec(make_shlib_u), make_shlib_u, prec(make_shlib_s), make_shlib_s, prec(make_shlib_e), make_shlib_e
76  if (gxx_i != 0)
77    printf "c++/cc[%d]: %.*f user %.*f system %.*f elapsed\n"   \
78      , gxx_i, prec(gxx_u), gxx_u, prec(gxx_s), gxx_s, prec(gxx_e), gxx_e
79  if (dep_i != 0)
80    printf "dep[%d]: %.*f user %.*f system %.*f elapsed\n"      \
81      , dep_i, prec(dep_u), dep_u, prec(dep_s), dep_s, prec(dep_e), dep_e
82  printf "cmt[%d]: %.*f user %.*f system %.*f elapsed\n"        \
83    , cmt_tot_i, prec(cmt_tot_u), cmt_tot_u, prec(cmt_tot_s), cmt_tot_s, prec(cmt_tot_e), cmt_tot_e
84  printf "average rss_max: %.0fk\npage faults: %d major + %d minor\ncontext switch: %d involuntarily + %d voluntarily\n" \
85    , (rss_max_i != 0 ? rss_max/rss_max_i : 0), major_pf, minor_pf, cswitch, wswitch
86  print "Breakdown:"
87  for (n in cmt_f_i) {
88    printf "cmt fast [%s] [%d]: %.*f user %.*f system %.*f elapsed\n"   \
89      , n, cmt_f_i[n], prec(cmt_f_u[n]), cmt_f_u[n], prec(cmt_f_s[n]), cmt_f_s[n], prec(cmt_f_e[n]), cmt_f_e[n]
90    f_i += cmt_f_i[n]; f_u += cmt_f_u[n]; f_s += cmt_f_s[n]; f_e += cmt_f_e[n]
91  }
92  printf "cmt fast [%d]: %.*f user %.*f system %.*f elapsed\n"  \
93    , f_i, prec(f_u), f_u, prec(f_s), f_s, prec(f_e), f_e
94  i=0
95  for (n in cmt_i) {
96    printf "cmt [%s] [%d]: %.*f user %.*f system %.*f elapsed\n"        \
97      , n, cmt_i[n], prec(cmt_u[n]), cmt_u[n], prec(cmt_s[n]), cmt_s[n], prec(cmt_e[n]), cmt_e[n]
98    i += cmt_i[n]; u += cmt_u[n]; s += cmt_s[n]; e += cmt_e[n]
99  }
100  printf "cmt [%d]: %.*f user %.*f system %.*f elapsed\n"       \
101    , i, prec(u), u, prec(s), s, prec(e), e
102
103  if ($0 != "")
104    printf "\n%s\n", $0
105}
Note: See TracBrowser for help on using the repository browser.