]> git.llucax.com Git - software/dgc/dgcbench.git/blob - mempat-tsv.py
Create time/pause sub-directories in ./build
[software/dgc/dgcbench.git] / mempat-tsv.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         return str(n)
30
31 def percent(n, total):
32         return '%f' % (float(n) / total * 100)
33
34 def bytes(n):
35         return str(n)
36
37 f = file(sys.argv[1])
38 f.readline() # ignore headers
39
40 sizes = list()
41 sizes_ti = list()
42 size_freq = dict()
43 size_freq_ti = dict()
44 for l in f:
45         d = l.split(',')
46         size = int(d[SIZE])
47         no_scan = bool(int(d[NO_SCAN]))
48         if no_scan:
49                 sizes.append(size)
50                 size_freq[size] = size_freq.get(size, 0) + 1
51         else:
52                 sizes_ti.append(size)
53                 size_freq_ti[size] = size_freq_ti.get(size, 0) + 1
54
55 scan_c = len(sizes_ti)
56 no_scan_c = len(sizes)
57 total_c = scan_c + no_scan_c
58
59 scan_b = sum(sizes_ti)
60 no_scan_b = sum(sizes)
61 total_b = scan_b + no_scan_b
62
63 p('Number of objects')
64 p('Scanned\tNot scanned\tTotal')
65 p('%s\t%s\t%s', num(scan_c), num(no_scan_c), num(total_c))
66 p()
67
68 p('Bytes')
69 p('Scanned\tNot scanned\tTotal')
70 p('%s\t%s\t%s', bytes(scan_b), bytes(no_scan_b), bytes(total_b))
71 p()
72
73 different_sizes_c = len(set(size_freq.keys()).union(size_freq_ti.keys()))
74 p('Different object sizes')
75 p(num(different_sizes_c))
76 p()
77
78 p('Objects requested')
79 p('Bin Size\tNumber\tBytes')
80 alloc_c = dict()
81 n = sum((freq for size, freq in size_freq.iteritems() if size <= bins[0]))
82 n += sum((freq for size, freq in size_freq_ti.iteritems() if size <= bins[0]))
83 b = sum((size*freq for size, freq in size_freq.iteritems() if size <= bins[0]))
84 b += sum((size*freq for size, freq in size_freq_ti.iteritems()
85                 if size <= bins[0]))
86 alloc_c[bins[0]] = n
87 p('%s\t%s\t%s', bins[0], num(n), bytes(b))
88 n_prev = n
89 b_prev = b
90 for bin in bins[1:]:
91         n = sum((freq for size, freq in size_freq.iteritems() if size <= bin))
92         n += sum((freq for size, freq in size_freq_ti.iteritems()
93                         if size <= bin))
94         b = sum((size*freq for size, freq in size_freq.iteritems()
95                         if size <= bin))
96         b += sum((size*freq for size, freq in size_freq_ti.iteritems()
97                         if size <= bin))
98         nn = n - n_prev
99         bb = b - b_prev
100         alloc_c[bin] = nn
101         p('%s\t%s\t%s', bin, num(nn), bytes(bb))
102         n_prev = n
103         b_prev = b
104 n = sum((freq for size, freq in size_freq.iteritems() if size > 4096))
105 n += sum((freq for size, freq in size_freq_ti.iteritems() if size > 4096))
106 b = sum((size*freq for size, freq in size_freq.iteritems() if size > 4096))
107 b += sum((size*freq for size, freq in size_freq_ti.iteritems() if size > 4096))
108 alloc_pplus_c = n
109 p('>4096\t%s\t%s', num(n), bytes(b))
110 p()
111
112 def wasted_bin(start, end, extra=0):
113         w = 0
114         for i in range(start, end+1):
115                 w += (end - i) * size_freq.get(i, 0)
116                 if i <= (end - extra):
117                         w += (end - i) * size_freq_ti.get(i, 0)
118                 elif extra:
119                         w += (2*end - i) * size_freq_ti.get(i, 0)
120         return w
121
122 def wasted_pageplus(extra=0):
123         w = 0
124         for size, freq in size_freq.iteritems():
125                 if size > 4096:
126                         w += (size % 4096) * freq
127         for size, freq in size_freq_ti.iteritems():
128                 size += extra
129                 if size > 4096:
130                         w += (size % 4096 + extra) * freq
131         return w
132
133 def print_wasted(mode, extra=0):
134         wasted = dict()
135         wasted[bins[0]] = wasted_bin(1, bins[0], extra)
136         for bin in bins[1:]:
137                 wasted[bin] = wasted_bin(bin/2 + 1, bin, extra)
138         wasted_pplus = wasted_pageplus()
139         wasted_total = sum((w for w in wasted.values())) + wasted_pplus
140         alloc_total = total_b + wasted_total
141         p('Real allocated bytes for mode %s', mode)
142         p('Totals')
143         p('Requested\tWasted\tTotal')
144         p('%s\t%s\t%s', bytes(total_b), bytes(wasted_total), bytes(alloc_total))
145         p('Bin\tWasted')
146         p('%s\t%s', bins[0], bytes(wasted[bins[0]]))
147         for bin in bins[1:]:
148                 p('%s\t%s', bin, bytes(wasted[bin]))
149         p('>4096\t%s', bytes(wasted_pplus))
150         p()
151
152 print_wasted('Conservative')
153 print_wasted('Precise', 4)
154
155 #print size_freq, size_freq_ti
156