1*90c8c64dSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*90c8c64dSAndroid Build Coastguard Worker# 3*90c8c64dSAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project 4*90c8c64dSAndroid Build Coastguard Worker# 5*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*90c8c64dSAndroid Build Coastguard Worker# 9*90c8c64dSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*90c8c64dSAndroid Build Coastguard Worker# 11*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*90c8c64dSAndroid Build Coastguard Worker# limitations under the License. 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Workerimport sys 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Workerfrom read_build_trace_gz import Trace 20*90c8c64dSAndroid Build Coastguard Worker 21*90c8c64dSAndroid Build Coastguard Worker 22*90c8c64dSAndroid Build Coastguard Worker 23*90c8c64dSAndroid Build Coastguard Worker 24*90c8c64dSAndroid Build Coastguard Workerdef compare(target, target_name, ref, ref_name, ignore_text=None): 25*90c8c64dSAndroid Build Coastguard Worker """Compares which modules are built additionally from the target compared to 26*90c8c64dSAndroid Build Coastguard Worker the ref trace. It returns the additional modules sorted by the build time 27*90c8c64dSAndroid Build Coastguard Worker duration. 28*90c8c64dSAndroid Build Coastguard Worker 29*90c8c64dSAndroid Build Coastguard Worker Args: 30*90c8c64dSAndroid Build Coastguard Worker target: Trace class, The build.trace.gz information of the target build. 31*90c8c64dSAndroid Build Coastguard Worker It has duration dictionary of {module_name:duration}. 32*90c8c64dSAndroid Build Coastguard Worker target_name: str, target name of the target build. 33*90c8c64dSAndroid Build Coastguard Worker ref: Trace class, The build.trace.gz information of the reference build. 34*90c8c64dSAndroid Build Coastguard Worker ref_name: str, target name of the reference build. 35*90c8c64dSAndroid Build Coastguard Worker Returns: 36*90c8c64dSAndroid Build Coastguard Worker list of (module, duration) pairs, sum of all durations 37*90c8c64dSAndroid Build Coastguard Worker """ 38*90c8c64dSAndroid Build Coastguard Worker additional_modules = dict() 39*90c8c64dSAndroid Build Coastguard Worker additional_time = 0 40*90c8c64dSAndroid Build Coastguard Worker 41*90c8c64dSAndroid Build Coastguard Worker # Trace.duration is a dictionary of module_name:duration. 42*90c8c64dSAndroid Build Coastguard Worker for mod in target.duration.keys(): 43*90c8c64dSAndroid Build Coastguard Worker if ignore_text and ignore_text in mod: 44*90c8c64dSAndroid Build Coastguard Worker continue 45*90c8c64dSAndroid Build Coastguard Worker if mod.replace(target_name, ref_name) not in ref.duration: 46*90c8c64dSAndroid Build Coastguard Worker additional_modules[mod] = target.duration[mod] 47*90c8c64dSAndroid Build Coastguard Worker additional_time += target.duration[mod] 48*90c8c64dSAndroid Build Coastguard Worker 49*90c8c64dSAndroid Build Coastguard Worker return (sorted(additional_modules.items(), key=lambda x:x[1], reverse=True), 50*90c8c64dSAndroid Build Coastguard Worker additional_time) 51*90c8c64dSAndroid Build Coastguard Worker 52*90c8c64dSAndroid Build Coastguard Workerdef usec_to_min(usec): 53*90c8c64dSAndroid Build Coastguard Worker min = usec // 60000000 54*90c8c64dSAndroid Build Coastguard Worker sec = usec % 60000000 // 1000000 55*90c8c64dSAndroid Build Coastguard Worker msec = usec % 1000000 // 1000 56*90c8c64dSAndroid Build Coastguard Worker return (min, sec, msec) 57*90c8c64dSAndroid Build Coastguard Worker 58*90c8c64dSAndroid Build Coastguard Worker 59*90c8c64dSAndroid Build Coastguard Workerdef main(argv): 60*90c8c64dSAndroid Build Coastguard Worker # args: target_build.trace.gz target_name 61*90c8c64dSAndroid Build Coastguard Worker # ref_build.trace.gz ref_name 62*90c8c64dSAndroid Build Coastguard Worker # (ignore_text) 63*90c8c64dSAndroid Build Coastguard Worker ignore_text = None 64*90c8c64dSAndroid Build Coastguard Worker if len(argv) == 6: 65*90c8c64dSAndroid Build Coastguard Worker ignore_text = argv[5] 66*90c8c64dSAndroid Build Coastguard Worker elif len(argv) < 5 or len(argv) > 6: 67*90c8c64dSAndroid Build Coastguard Worker print("usage: compare_build_trace.py target_build.trace.gz target_name") 68*90c8c64dSAndroid Build Coastguard Worker print(" ref_build.trace.gz ref_name") 69*90c8c64dSAndroid Build Coastguard Worker print(" [ignore_text]") 70*90c8c64dSAndroid Build Coastguard Worker sys.exit(1) 71*90c8c64dSAndroid Build Coastguard Worker 72*90c8c64dSAndroid Build Coastguard Worker additional_modules, additional_time = compare(Trace(argv[1]), argv[2], 73*90c8c64dSAndroid Build Coastguard Worker Trace(argv[3]), argv[4], 74*90c8c64dSAndroid Build Coastguard Worker ignore_text) 75*90c8c64dSAndroid Build Coastguard Worker for module, duration in additional_modules: 76*90c8c64dSAndroid Build Coastguard Worker min, sec, msec = usec_to_min(duration) 77*90c8c64dSAndroid Build Coastguard Worker print('{min}m {sec}s {msec}ms: {name}'.format( 78*90c8c64dSAndroid Build Coastguard Worker min=min, sec=sec, msec=msec, name=module)) 79*90c8c64dSAndroid Build Coastguard Worker min, sec, msec = usec_to_min(additional_time) 80*90c8c64dSAndroid Build Coastguard Worker print('Total: {min}m {sec}s {msec}ms'.format( 81*90c8c64dSAndroid Build Coastguard Worker min=min, sec=sec, msec=msec)) 82*90c8c64dSAndroid Build Coastguard Worker 83*90c8c64dSAndroid Build Coastguard Workerif __name__ == '__main__': 84*90c8c64dSAndroid Build Coastguard Worker main(sys.argv)