]> git.llucax.com Git - software/dgc/dgcbench.git/blob - mempat.py
Create time/pause sub-directories in ./build
[software/dgc/dgcbench.git] / mempat.py
1 #!/usr/bin/env python
2
3 import sys
4 import numpy
5
6 SIZE = 3
7 NO_SCAN = 6
8
9 KiB = 2**10
10 MiB = 2**20
11 GiB = 2**30
12
13 bytes_suffix = {
14         KiB: 'KiB',
15         MiB: 'MiB',
16         GiB: 'GiB',
17 }
18
19 # 16 32 ... 2048 4096
20 bins = [1 << n for n in range(4, 13)]
21
22 class Info:
23         pass
24
25 def p(msg, *args):
26         print msg % args
27
28 def num(n):
29         sn = str(n)
30         c = len(sn)
31         if c <= 3:
32                 return sn
33         sep_pos = reversed(range(c-3, 0, -3))
34         return ','.join([sn[:c%3 or 3]] + [str(sn[i:i+3]) for i in sep_pos])
35
36 def rm0(n):
37         s = '%.02f' % n
38         if s.endswith('00'):
39                 return s[:-3]
40         if s.endswith('0'):
41                 return s[:-1]
42         return s
43
44 def percent(n, total):
45         return rm0(float(n) / total * 100) + '%'
46
47 def bytes(n):
48         for mult in sorted(bytes_suffix.keys(), reverse=True):
49                 if n >= mult:
50                         return '%s bytes [%s%s]' % (num(n),
51                                         rm0(float(n) / mult),
52                                         bytes_suffix[mult])
53         return '%s bytes' % n
54
55 f = file(sys.argv[1])
56 f.readline() # ignore headers
57
58 sizes = list()
59 sizes_ti = list()
60 size_freq = dict()
61 size_freq_ti = dict()
62 for l in f:
63         d = l.split(',')
64         size = int(d[SIZE])
65         no_scan = bool(int(d[NO_SCAN]))
66         if no_scan:
67                 sizes.append(size)
68                 size_freq[size] = size_freq.get(size, 0) + 1
69         else:
70                 sizes_ti.append(size)
71                 size_freq_ti[size] = size_freq_ti.get(size, 0) + 1
72
73 scan_c = len(sizes_ti)
74 no_scan_c = len(sizes)
75 total_c = scan_c + no_scan_c
76
77 scan_b = sum(sizes_ti)
78 no_scan_b = sum(sizes)
79 total_b = scan_b + no_scan_b
80
81 p('Total requested: %s objecs, %s', num(total_c), bytes(total_b))
82 p('\tScanned: %s (%s) objecs, %s (%s)', num(scan_c), percent(scan_c, total_c),
83                 bytes(scan_b), percent(scan_b, total_b))
84 p('\tNot scanned: %s (%s) objecs, %s (%s)', num(no_scan_c),
85                 percent(no_scan_c, total_c), bytes(no_scan_b),
86                 percent(no_scan_b, total_b))
87
88 different_sizes_c = len(set(size_freq.keys()).union(size_freq_ti.keys()))
89 p('Different object sizes: %s', num(different_sizes_c))
90
91 p('Objects requested with a bin size of:')
92 alloc_c = dict()
93 n = sum((freq for size, freq in size_freq.iteritems() if size <= bins[0]))
94 n += sum((freq for size, freq in size_freq_ti.iteritems() if size <= bins[0]))
95 b = sum((size*freq for size, freq in size_freq.iteritems() if size <= bins[0]))
96 b += sum((size*freq for size, freq in size_freq_ti.iteritems()
97                 if size <= bins[0]))
98 alloc_c[bins[0]] = n
99 if n:
100         p('\t%s bytes: %s (%s) objects, %s (%s)', bins[0], num(n),
101                         percent(n, total_c), bytes(b), percent(b, total_b))
102 n_prev = n
103 b_prev = b
104 for bin in bins[1:]:
105         n = sum((freq for size, freq in size_freq.iteritems() if size <= bin))
106         n += sum((freq for size, freq in size_freq_ti.iteritems()
107                         if size <= bin))
108         b = sum((size*freq for size, freq in size_freq.iteritems()
109                         if size <= bin))
110         b += sum((size*freq for size, freq in size_freq_ti.iteritems()
111                         if size <= bin))
112         nn = n - n_prev
113         bb = b - b_prev
114         alloc_c[bin] = nn
115         if nn:
116                 p('\t%s bytes: %s (%s, %s cumulative) objects, '
117                                 '%s (%s, %s cumulative)', bin, num(nn),
118                                 percent(nn, total_c), percent(n, total_c),
119                                 bytes(bb), percent(bb, total_b),
120                                 percent(b, total_b))
121                 n_prev = n
122                 b_prev = b
123 n = sum((freq for size, freq in size_freq.iteritems() if size > 4096))
124 n += sum((freq for size, freq in size_freq_ti.iteritems() if size > 4096))
125 b = sum((size*freq for size, freq in size_freq.iteritems() if size > 4096))
126 b += sum((size*freq for size, freq in size_freq_ti.iteritems() if size > 4096))
127 alloc_pplus_c = n
128 if n:
129         p('\tmore than a page: %s (%s) objects, %s (%s)', num(n),
130                         percent(n, total_c), bytes(b), percent(b, total_b))
131
132 def wasted_bin(start, end, extra=0):
133         w = 0
134         for i in range(start, end+1):
135                 w += (end - i) * size_freq.get(i, 0)
136                 if i <= (end - extra):
137                         w += (end - i) * size_freq_ti.get(i, 0)
138                 elif extra:
139                         w += (2*end - i) * size_freq_ti.get(i, 0)
140         return w
141
142 def wasted_pageplus(extra=0):
143         w = 0
144         for size, freq in size_freq.iteritems():
145                 if size > 4096:
146                         w += (size % 4096) * freq
147         for size, freq in size_freq_ti.iteritems():
148                 size += extra
149                 if size > 4096:
150                         w += (size % 4096 + extra) * freq
151         return w
152
153 def print_wasted(mode, extra=0):
154         wasted = dict()
155         wasted[bins[0]] = wasted_bin(1, bins[0], extra)
156         for bin in bins[1:]:
157                 wasted[bin] = wasted_bin(bin/2 + 1, bin, extra)
158         wasted_pplus = wasted_pageplus()
159         wasted_total = sum((w for w in wasted.values())) + wasted_pplus
160         alloc_total = wasted_total + total_b
161         p('%s mode:', mode)
162         p('\tTotal allocated: %s', bytes(alloc_total))
163         p('\tTotal wasted: %s, %s', bytes(wasted_total), percent(wasted_total,
164                         alloc_total))
165         p('\tWasted due to objects that should use a bin of:')
166         if alloc_c[bins[0]]:
167                 p('\t  %s bytes: %s (%s)', bins[0], bytes(wasted[bins[0]]),
168                                 percent(wasted[bins[0]], wasted_total))
169         w_cumulative = wasted[bins[0]]
170         for bin in bins[1:]:
171                 if wasted[bin] == 0 and alloc_c[bin] == 0:
172                         continue
173                 w_cumulative += wasted[bin]
174                 p('\t  %s bytes: %s (%s, %s cumulative)', bin,
175                                 bytes(wasted[bin]), percent(wasted[bin],
176                                 wasted_total), percent(w_cumulative,
177                                 wasted_total))
178         if alloc_pplus_c:
179                 p('\t  more than a page: %s (%s)', bytes(wasted_pplus),
180                                 percent(wasted_pplus, wasted_total))
181
182 print_wasted('Conservative')
183 print_wasted('Precise', 4)
184
185 #print size_freq, size_freq_ti
186