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 | } |
---|
59 | function prec (val) |
---|
60 | { |
---|
61 | if (val >= 100) return 0 |
---|
62 | else if (val >= 10) return 1 |
---|
63 | else return 2 |
---|
64 | } |
---|
65 | END { |
---|
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 | } |
---|