@@ -98,6 +98,13 @@ def prefixed_by(self, prefix):
98
98
self .module , self .start_usec , self .dur_usec ,
99
99
self .jobargs , prefixed_stats )
100
100
101
+ def divided_by (self , n ):
102
+ divided_stats = dict ([(k , v / n )
103
+ for (k , v ) in self .stats .items ()])
104
+ return JobStats (self .jobkind , random .randint (0 , 1000000000 ),
105
+ self .module , self .start_usec , self .dur_usec ,
106
+ self .jobargs , divided_stats )
107
+
101
108
def incrementality_percentage (self ):
102
109
"""Assuming the job is a driver job, return the amount of
103
110
jobs that actually ran, as a percentage of the total number."""
@@ -170,25 +177,56 @@ def to_lnt_test_obj(self, args):
170
177
}
171
178
172
179
180
+ AUXPATSTR = (r"(?P<module>[^-]+)-(?P<input>[^-]+)-(?P<triple>[^-]+)" +
181
+ r"-(?P<out>[^-]*)-(?P<opt>[^-]+)" )
182
+ AUXPAT = re .compile (AUXPATSTR )
183
+
184
+ TIMERPATSTR = (r"time\.swift-(?P<jobkind>\w+)\." + AUXPATSTR +
185
+ "\.(?P<timerkind>\w+)$" )
186
+ TIMERPAT = re .compile (TIMERPATSTR )
187
+
188
+ FILEPATSTR = (r"^stats-(?P<start>\d+)-swift-(?P<kind>\w+)-" +
189
+ AUXPATSTR +
190
+ r"-(?P<pid>\d+)(-.*)?.json$" )
191
+ FILEPAT = re .compile (FILEPATSTR )
192
+
193
+
194
+ def match_auxpat (s ):
195
+ m = AUXPAT .match (s )
196
+ if m is not None :
197
+ return m .groupdict ()
198
+ else :
199
+ return None
200
+
201
+
202
+ def match_timerpat (s ):
203
+ m = TIMERPAT .match (s )
204
+ if m is not None :
205
+ return m .groupdict ()
206
+ else :
207
+ return None
208
+
209
+
210
+ def match_filepat (s ):
211
+ m = FILEPAT .match (s )
212
+ if m is not None :
213
+ return m .groupdict ()
214
+ else :
215
+ return None
216
+
217
+
173
218
def load_stats_dir (path , select_module = [], select_stat = [],
174
- exclude_timers = False , ** kwargs ):
219
+ exclude_timers = False , merge_timers = False , ** kwargs ):
175
220
"""Loads all stats-files found in path into a list of JobStats objects"""
176
221
jobstats = []
177
- auxpat = (r"(?P<module>[^-]+)-(?P<input>[^-]+)-(?P<triple>[^-]+)" +
178
- r"-(?P<out>[^-]*)-(?P<opt>[^-]+)" )
179
- fpat = (r"^stats-(?P<start>\d+)-swift-(?P<kind>\w+)-" +
180
- auxpat +
181
- r"-(?P<pid>\d+)(-.*)?.json$" )
182
- fre = re .compile (fpat )
183
222
sre = re .compile ('.*' if len (select_stat ) == 0 else
184
223
'|' .join (select_stat ))
185
224
for root , dirs , files in os .walk (path ):
186
225
for f in files :
187
- m = fre . match (f )
188
- if not m :
226
+ mg = match_filepat (f )
227
+ if not mg :
189
228
continue
190
229
# NB: "pid" in fpat is a random number, not unix pid.
191
- mg = m .groupdict ()
192
230
jobkind = mg ['kind' ]
193
231
jobid = int (mg ['pid' ])
194
232
start_usec = int (mg ['start' ])
@@ -200,21 +238,22 @@ def load_stats_dir(path, select_module=[], select_stat=[],
200
238
with open (os .path .join (root , f )) as fp :
201
239
j = json .load (fp )
202
240
dur_usec = 1
203
- patstr = (r"time\.swift-" + jobkind + r"\." + auxpat +
204
- r"\.wall$" )
205
- pat = re .compile (patstr )
206
241
stats = dict ()
207
242
for (k , v ) in j .items ():
208
243
if sre .search (k ) is None :
209
244
continue
210
- if k .startswith ("time." ):
245
+ if k .startswith ('time.' ) and exclude_timers :
246
+ continue
247
+ tm = match_timerpat (k )
248
+ if tm :
211
249
v = int (1000000.0 * float (v ))
212
- if exclude_timers :
213
- continue
250
+ if tm ['jobkind' ] == jobkind and \
251
+ tm ['timerkind' ] == 'wall' :
252
+ dur_usec = v
253
+ if merge_timers :
254
+ k = "time.swift-%s.%s" % (tm ['jobkind' ],
255
+ tm ['timerkind' ])
214
256
stats [k ] = v
215
- tm = re .match (pat , k )
216
- if tm :
217
- dur_usec = v
218
257
219
258
e = JobStats (jobkind = jobkind , jobid = jobid ,
220
259
module = module , start_usec = start_usec ,
@@ -225,7 +264,7 @@ def load_stats_dir(path, select_module=[], select_stat=[],
225
264
226
265
227
266
def merge_all_jobstats (jobstats , select_module = [], group_by_module = False ,
228
- merge_by = "sum" , ** kwargs ):
267
+ merge_by = "sum" , divide_by = 1 , ** kwargs ):
229
268
"""Does a pairwise merge of the elements of list of jobs"""
230
269
m = None
231
270
if len (select_module ) > 0 :
@@ -237,12 +276,15 @@ def keyfunc(j):
237
276
jobstats .sort (key = keyfunc )
238
277
prefixed = []
239
278
for mod , group in itertools .groupby (jobstats , keyfunc ):
240
- groupmerge = merge_all_jobstats (group , merge_by = merge_by )
279
+ groupmerge = merge_all_jobstats (group , merge_by = merge_by ,
280
+ divide_by = divide_by )
241
281
prefixed .append (groupmerge .prefixed_by (mod ))
242
282
jobstats = prefixed
243
283
for j in jobstats :
244
284
if m is None :
245
285
m = j
246
286
else :
247
287
m = m .merged_with (j , merge_by = merge_by )
248
- return m
288
+ if m is None :
289
+ return m
290
+ return m .divided_by (divide_by )
0 commit comments