| [ |
| { |
| "cmd": [ |
| "vpython", |
| "-u", |
| "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py", |
| "--json-output", |
| "/path/to/tmp/json", |
| "listdir", |
| "[START_DIR]/lottie-samples" |
| ], |
| "infra_step": true, |
| "name": "list lottie files", |
| "~followup_annotations": [ |
| "@@@STEP_LOG_LINE@listdir@[START_DIR]/lottie-samples/LICENSE@@@", |
| "@@@STEP_LOG_LINE@listdir@[START_DIR]/lottie-samples/lottie1.json@@@", |
| "@@@STEP_LOG_LINE@listdir@[START_DIR]/lottie-samples/lottie2.json@@@", |
| "@@@STEP_LOG_LINE@listdir@[START_DIR]/lottie-samples/lottie3.json@@@", |
| "@@@STEP_LOG_END@listdir@@@" |
| ] |
| }, |
| { |
| "cmd": [ |
| "npm", |
| "install" |
| ], |
| "cwd": "[START_DIR]/skia/tools/lottie-web-perf", |
| "env_prefixes": { |
| "PATH": [ |
| "[START_DIR]/node/node/bin" |
| ] |
| }, |
| "name": "npm install" |
| }, |
| { |
| "cmd": [ |
| "[START_DIR]/node/node/bin/node", |
| "[START_DIR]/skia/tools/lottie-web-perf/lottie-web-perf.js", |
| "--backend", |
| "svg", |
| "--input", |
| "[START_DIR]/lottie-samples/lottie1.json", |
| "--output", |
| "[CLEANUP]/g3_try_tmp_1/lottie1.json" |
| ], |
| "cwd": "[START_DIR]/skia/tools/lottie-web-perf", |
| "env": { |
| "CHROME_HEADLESS": "1", |
| "DISPLAY": ":0", |
| "PATH": "<PATH>:RECIPE_REPO[depot_tools]" |
| }, |
| "infra_step": true, |
| "name": "Run perf cmd line app" |
| }, |
| { |
| "cmd": [ |
| "python", |
| "-u", |
| "\nimport json\nimport sys\n\ntrace_output = sys.argv[1]\nwith open(trace_output, 'r') as f:\n trace_json = json.load(f)\noutput_json_file = sys.argv[2]\nrenderer = sys.argv[3] # Unused for now but might be useful in the future.\n\n# Output data about the GPU that was used.\nprint('GPU data:')\nprint(trace_json['metadata'].get('gpu-gl-renderer'))\nprint(trace_json['metadata'].get('gpu-driver'))\nprint(trace_json['metadata'].get('gpu-gl-vendor'))\n\nerroneous_termination_statuses = [\n 'replaced_by_new_reporter_at_same_stage',\n 'did_not_produce_frame',\n]\naccepted_termination_statuses = [\n 'missed_frame',\n 'submitted_frame',\n 'main_frame_aborted'\n]\n\ncurrent_frame_duration = 0\ntotal_frames = 0\nframe_id_to_start_ts = {}\n# Will contain tuples of frame_ids and their duration and status.\ncompleted_frame_id_and_duration_status = []\n# Will contain tuples of drawn frame_ids and their duration.\ndrawn_frame_id_and_duration = []\nfor trace in trace_json['traceEvents']:\n if 'PipelineReporter' in trace['name']:\n frame_id = trace['id']\n args = trace.get('args')\n if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':\n frame_id_to_start_ts[frame_id] = trace['ts']\n elif args and (args.get('termination_status') in\n accepted_termination_statuses):\n if not frame_id_to_start_ts.get(frame_id):\n print('[No start ts found for %s]' % frame_id)\n continue\n current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]\n total_frames += 1\n completed_frame_id_and_duration_status.append(\n (frame_id, current_frame_duration, args['termination_status']))\n if(args['termination_status'] == 'missed_frame' or\n args['termination_status'] == 'submitted_frame'):\n drawn_frame_id_and_duration.append((frame_id, current_frame_duration))\n\n # We are done with this frame_id so remove it from the dict.\n frame_id_to_start_ts.pop(frame_id)\n print('%d (%s with %s): %d' % (\n total_frames, frame_id, args['termination_status'],\n current_frame_duration))\n elif args and (args.get('termination_status') in\n erroneous_termination_statuses):\n # Invalidate previously collected results for this frame_id.\n if frame_id_to_start_ts.get(frame_id):\n print('[Invalidating %s due to %s]' % (\n frame_id, args['termination_status']))\n frame_id_to_start_ts.pop(frame_id)\n\n# Calculate metrics for total completed frames.\ntotal_completed_frames = len(completed_frame_id_and_duration_status)\nif total_completed_frames < 25:\n raise Exception('Even with 3 loops found only %d frames' %\n total_completed_frames)\n# Get frame avg/min/max for the middle 25 frames.\nstart = (total_completed_frames - 25)/2\nprint('Got %d total completed frames. Using indexes [%d, %d).' % (\n total_completed_frames, start, start+25))\nframe_max = 0\nframe_min = 0\nframe_cumulative = 0\naborted_frames = 0\nfor frame_id, duration, status in (\n completed_frame_id_and_duration_status[start:start+25]):\n frame_max = max(frame_max, duration)\n frame_min = min(frame_min, duration) if frame_min else duration\n frame_cumulative += duration\n if status == 'main_frame_aborted':\n aborted_frames += 1\n\nperf_results = {}\nperf_results['frame_max_us'] = frame_max\nperf_results['frame_min_us'] = frame_min\nperf_results['frame_avg_us'] = frame_cumulative/25\nperf_results['aborted_frames'] = aborted_frames\n\n# Now calculate metrics for only drawn frames.\ndrawn_frame_max = 0\ndrawn_frame_min = 0\ndrawn_frame_cumulative = 0\ntotal_drawn_frames = len(drawn_frame_id_and_duration)\nif total_drawn_frames < 25:\n raise Exception('Even with 3 loops found only %d drawn frames' %\n total_drawn_frames)\n# Get drawn frame avg/min/max from the middle 25 frames.\nstart = (total_drawn_frames - 25)/2\nprint('Got %d total drawn frames. Using indexes [%d-%d).' % (\n total_drawn_frames, start, start+25))\nfor frame_id, duration in drawn_frame_id_and_duration[start:start+25]:\n drawn_frame_max = max(drawn_frame_max, duration)\n drawn_frame_min = (min(drawn_frame_min, duration)\n if drawn_frame_min else duration)\n drawn_frame_cumulative += duration\n# Add metrics to perf_results.\nperf_results['drawn_frame_max_us'] = drawn_frame_max\nperf_results['drawn_frame_min_us'] = drawn_frame_min\nperf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25\n\nprint('Final perf_results dict: %s' % perf_results)\n\n# Write perf_results to the output json.\nwith open(output_json_file, 'w') as f:\n f.write(json.dumps(perf_results))\n", |
| "[CLEANUP]/g3_try_tmp_1/lottie1.json", |
| "/path/to/tmp/json", |
| "lottie-web" |
| ], |
| "env": { |
| "CHROME_HEADLESS": "1", |
| "PATH": "<PATH>:RECIPE_REPO[depot_tools]" |
| }, |
| "name": "parse lottie1.json trace", |
| "~followup_annotations": [ |
| "@@@STEP_LOG_LINE@json.output@{@@@", |
| "@@@STEP_LOG_LINE@json.output@ \"frame_avg_us\": 179.71, @@@", |
| "@@@STEP_LOG_LINE@json.output@ \"frame_max_us\": 218.25, @@@", |
| "@@@STEP_LOG_LINE@json.output@ \"frame_min_us\": 141.17@@@", |
| "@@@STEP_LOG_LINE@json.output@}@@@", |
| "@@@STEP_LOG_END@json.output@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@import json@@@", |
| "@@@STEP_LOG_LINE@python.inline@import sys@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@trace_output = sys.argv[1]@@@", |
| "@@@STEP_LOG_LINE@python.inline@with open(trace_output, 'r') as f:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ trace_json = json.load(f)@@@", |
| "@@@STEP_LOG_LINE@python.inline@output_json_file = sys.argv[2]@@@", |
| "@@@STEP_LOG_LINE@python.inline@renderer = sys.argv[3] # Unused for now but might be useful in the future.@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Output data about the GPU that was used.@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('GPU data:')@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(trace_json['metadata'].get('gpu-gl-renderer'))@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(trace_json['metadata'].get('gpu-driver'))@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(trace_json['metadata'].get('gpu-gl-vendor'))@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@erroneous_termination_statuses = [@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'replaced_by_new_reporter_at_same_stage',@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'did_not_produce_frame',@@@", |
| "@@@STEP_LOG_LINE@python.inline@]@@@", |
| "@@@STEP_LOG_LINE@python.inline@accepted_termination_statuses = [@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'missed_frame',@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'submitted_frame',@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'main_frame_aborted'@@@", |
| "@@@STEP_LOG_LINE@python.inline@]@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@current_frame_duration = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@total_frames = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_id_to_start_ts = {}@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Will contain tuples of frame_ids and their duration and status.@@@", |
| "@@@STEP_LOG_LINE@python.inline@completed_frame_id_and_duration_status = []@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Will contain tuples of drawn frame_ids and their duration.@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_id_and_duration = []@@@", |
| "@@@STEP_LOG_LINE@python.inline@for trace in trace_json['traceEvents']:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if 'PipelineReporter' in trace['name']:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id = trace['id']@@@", |
| "@@@STEP_LOG_LINE@python.inline@ args = trace.get('args')@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts[frame_id] = trace['ts']@@@", |
| "@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@", |
| "@@@STEP_LOG_LINE@python.inline@ accepted_termination_statuses):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if not frame_id_to_start_ts.get(frame_id):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ print('[No start ts found for %s]' % frame_id)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ continue@@@", |
| "@@@STEP_LOG_LINE@python.inline@ current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_frames += 1@@@", |
| "@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status.append(@@@", |
| "@@@STEP_LOG_LINE@python.inline@ (frame_id, current_frame_duration, args['termination_status']))@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if(args['termination_status'] == 'missed_frame' or@@@", |
| "@@@STEP_LOG_LINE@python.inline@ args['termination_status'] == 'submitted_frame'):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_id_and_duration.append((frame_id, current_frame_duration))@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@ # We are done with this frame_id so remove it from the dict.@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ print('%d (%s with %s): %d' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_frames, frame_id, args['termination_status'],@@@", |
| "@@@STEP_LOG_LINE@python.inline@ current_frame_duration))@@@", |
| "@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@", |
| "@@@STEP_LOG_LINE@python.inline@ erroneous_termination_statuses):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ # Invalidate previously collected results for this frame_id.@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if frame_id_to_start_ts.get(frame_id):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ print('[Invalidating %s due to %s]' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id, args['termination_status']))@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Calculate metrics for total completed frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@total_completed_frames = len(completed_frame_id_and_duration_status)@@@", |
| "@@@STEP_LOG_LINE@python.inline@if total_completed_frames < 25:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d frames' %@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_completed_frames)@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Get frame avg/min/max for the middle 25 frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@start = (total_completed_frames - 25)/2@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('Got %d total completed frames. Using indexes [%d, %d).' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_completed_frames, start, start+25))@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_max = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_min = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_cumulative = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@aborted_frames = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@for frame_id, duration, status in (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status[start:start+25]):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_max = max(frame_max, duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_min = min(frame_min, duration) if frame_min else duration@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_cumulative += duration@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if status == 'main_frame_aborted':@@@", |
| "@@@STEP_LOG_LINE@python.inline@ aborted_frames += 1@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results = {}@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['frame_max_us'] = frame_max@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['frame_min_us'] = frame_min@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['frame_avg_us'] = frame_cumulative/25@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['aborted_frames'] = aborted_frames@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Now calculate metrics for only drawn frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_max = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_min = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_cumulative = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@total_drawn_frames = len(drawn_frame_id_and_duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@if total_drawn_frames < 25:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d drawn frames' %@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_drawn_frames)@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Get drawn frame avg/min/max from the middle 25 frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@start = (total_drawn_frames - 25)/2@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('Got %d total drawn frames. Using indexes [%d-%d).' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_drawn_frames, start, start+25))@@@", |
| "@@@STEP_LOG_LINE@python.inline@for frame_id, duration in drawn_frame_id_and_duration[start:start+25]:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_max = max(drawn_frame_max, duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_min = (min(drawn_frame_min, duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if drawn_frame_min else duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_cumulative += duration@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Add metrics to perf_results.@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_max_us'] = drawn_frame_max@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_min_us'] = drawn_frame_min@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('Final perf_results dict: %s' % perf_results)@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Write perf_results to the output json.@@@", |
| "@@@STEP_LOG_LINE@python.inline@with open(output_json_file, 'w') as f:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ f.write(json.dumps(perf_results))@@@", |
| "@@@STEP_LOG_END@python.inline@@@" |
| ] |
| }, |
| { |
| "cmd": [ |
| "[START_DIR]/node/node/bin/node", |
| "[START_DIR]/skia/tools/lottie-web-perf/lottie-web-perf.js", |
| "--backend", |
| "svg", |
| "--input", |
| "[START_DIR]/lottie-samples/lottie2.json", |
| "--output", |
| "[CLEANUP]/g3_try_tmp_1/lottie2.json" |
| ], |
| "cwd": "[START_DIR]/skia/tools/lottie-web-perf", |
| "env": { |
| "CHROME_HEADLESS": "1", |
| "DISPLAY": ":0", |
| "PATH": "<PATH>:RECIPE_REPO[depot_tools]" |
| }, |
| "infra_step": true, |
| "name": "Run perf cmd line app (2)" |
| }, |
| { |
| "cmd": [ |
| "python", |
| "-u", |
| "\nimport json\nimport sys\n\ntrace_output = sys.argv[1]\nwith open(trace_output, 'r') as f:\n trace_json = json.load(f)\noutput_json_file = sys.argv[2]\nrenderer = sys.argv[3] # Unused for now but might be useful in the future.\n\n# Output data about the GPU that was used.\nprint('GPU data:')\nprint(trace_json['metadata'].get('gpu-gl-renderer'))\nprint(trace_json['metadata'].get('gpu-driver'))\nprint(trace_json['metadata'].get('gpu-gl-vendor'))\n\nerroneous_termination_statuses = [\n 'replaced_by_new_reporter_at_same_stage',\n 'did_not_produce_frame',\n]\naccepted_termination_statuses = [\n 'missed_frame',\n 'submitted_frame',\n 'main_frame_aborted'\n]\n\ncurrent_frame_duration = 0\ntotal_frames = 0\nframe_id_to_start_ts = {}\n# Will contain tuples of frame_ids and their duration and status.\ncompleted_frame_id_and_duration_status = []\n# Will contain tuples of drawn frame_ids and their duration.\ndrawn_frame_id_and_duration = []\nfor trace in trace_json['traceEvents']:\n if 'PipelineReporter' in trace['name']:\n frame_id = trace['id']\n args = trace.get('args')\n if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':\n frame_id_to_start_ts[frame_id] = trace['ts']\n elif args and (args.get('termination_status') in\n accepted_termination_statuses):\n if not frame_id_to_start_ts.get(frame_id):\n print('[No start ts found for %s]' % frame_id)\n continue\n current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]\n total_frames += 1\n completed_frame_id_and_duration_status.append(\n (frame_id, current_frame_duration, args['termination_status']))\n if(args['termination_status'] == 'missed_frame' or\n args['termination_status'] == 'submitted_frame'):\n drawn_frame_id_and_duration.append((frame_id, current_frame_duration))\n\n # We are done with this frame_id so remove it from the dict.\n frame_id_to_start_ts.pop(frame_id)\n print('%d (%s with %s): %d' % (\n total_frames, frame_id, args['termination_status'],\n current_frame_duration))\n elif args and (args.get('termination_status') in\n erroneous_termination_statuses):\n # Invalidate previously collected results for this frame_id.\n if frame_id_to_start_ts.get(frame_id):\n print('[Invalidating %s due to %s]' % (\n frame_id, args['termination_status']))\n frame_id_to_start_ts.pop(frame_id)\n\n# Calculate metrics for total completed frames.\ntotal_completed_frames = len(completed_frame_id_and_duration_status)\nif total_completed_frames < 25:\n raise Exception('Even with 3 loops found only %d frames' %\n total_completed_frames)\n# Get frame avg/min/max for the middle 25 frames.\nstart = (total_completed_frames - 25)/2\nprint('Got %d total completed frames. Using indexes [%d, %d).' % (\n total_completed_frames, start, start+25))\nframe_max = 0\nframe_min = 0\nframe_cumulative = 0\naborted_frames = 0\nfor frame_id, duration, status in (\n completed_frame_id_and_duration_status[start:start+25]):\n frame_max = max(frame_max, duration)\n frame_min = min(frame_min, duration) if frame_min else duration\n frame_cumulative += duration\n if status == 'main_frame_aborted':\n aborted_frames += 1\n\nperf_results = {}\nperf_results['frame_max_us'] = frame_max\nperf_results['frame_min_us'] = frame_min\nperf_results['frame_avg_us'] = frame_cumulative/25\nperf_results['aborted_frames'] = aborted_frames\n\n# Now calculate metrics for only drawn frames.\ndrawn_frame_max = 0\ndrawn_frame_min = 0\ndrawn_frame_cumulative = 0\ntotal_drawn_frames = len(drawn_frame_id_and_duration)\nif total_drawn_frames < 25:\n raise Exception('Even with 3 loops found only %d drawn frames' %\n total_drawn_frames)\n# Get drawn frame avg/min/max from the middle 25 frames.\nstart = (total_drawn_frames - 25)/2\nprint('Got %d total drawn frames. Using indexes [%d-%d).' % (\n total_drawn_frames, start, start+25))\nfor frame_id, duration in drawn_frame_id_and_duration[start:start+25]:\n drawn_frame_max = max(drawn_frame_max, duration)\n drawn_frame_min = (min(drawn_frame_min, duration)\n if drawn_frame_min else duration)\n drawn_frame_cumulative += duration\n# Add metrics to perf_results.\nperf_results['drawn_frame_max_us'] = drawn_frame_max\nperf_results['drawn_frame_min_us'] = drawn_frame_min\nperf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25\n\nprint('Final perf_results dict: %s' % perf_results)\n\n# Write perf_results to the output json.\nwith open(output_json_file, 'w') as f:\n f.write(json.dumps(perf_results))\n", |
| "[CLEANUP]/g3_try_tmp_1/lottie2.json", |
| "/path/to/tmp/json", |
| "lottie-web" |
| ], |
| "env": { |
| "CHROME_HEADLESS": "1", |
| "PATH": "<PATH>:RECIPE_REPO[depot_tools]" |
| }, |
| "name": "parse lottie2.json trace", |
| "~followup_annotations": [ |
| "@@@STEP_LOG_LINE@json.output@{@@@", |
| "@@@STEP_LOG_LINE@json.output@ \"frame_avg_us\": 179.71, @@@", |
| "@@@STEP_LOG_LINE@json.output@ \"frame_max_us\": 218.25, @@@", |
| "@@@STEP_LOG_LINE@json.output@ \"frame_min_us\": 141.17@@@", |
| "@@@STEP_LOG_LINE@json.output@}@@@", |
| "@@@STEP_LOG_END@json.output@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@import json@@@", |
| "@@@STEP_LOG_LINE@python.inline@import sys@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@trace_output = sys.argv[1]@@@", |
| "@@@STEP_LOG_LINE@python.inline@with open(trace_output, 'r') as f:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ trace_json = json.load(f)@@@", |
| "@@@STEP_LOG_LINE@python.inline@output_json_file = sys.argv[2]@@@", |
| "@@@STEP_LOG_LINE@python.inline@renderer = sys.argv[3] # Unused for now but might be useful in the future.@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Output data about the GPU that was used.@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('GPU data:')@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(trace_json['metadata'].get('gpu-gl-renderer'))@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(trace_json['metadata'].get('gpu-driver'))@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(trace_json['metadata'].get('gpu-gl-vendor'))@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@erroneous_termination_statuses = [@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'replaced_by_new_reporter_at_same_stage',@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'did_not_produce_frame',@@@", |
| "@@@STEP_LOG_LINE@python.inline@]@@@", |
| "@@@STEP_LOG_LINE@python.inline@accepted_termination_statuses = [@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'missed_frame',@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'submitted_frame',@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'main_frame_aborted'@@@", |
| "@@@STEP_LOG_LINE@python.inline@]@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@current_frame_duration = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@total_frames = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_id_to_start_ts = {}@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Will contain tuples of frame_ids and their duration and status.@@@", |
| "@@@STEP_LOG_LINE@python.inline@completed_frame_id_and_duration_status = []@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Will contain tuples of drawn frame_ids and their duration.@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_id_and_duration = []@@@", |
| "@@@STEP_LOG_LINE@python.inline@for trace in trace_json['traceEvents']:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if 'PipelineReporter' in trace['name']:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id = trace['id']@@@", |
| "@@@STEP_LOG_LINE@python.inline@ args = trace.get('args')@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts[frame_id] = trace['ts']@@@", |
| "@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@", |
| "@@@STEP_LOG_LINE@python.inline@ accepted_termination_statuses):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if not frame_id_to_start_ts.get(frame_id):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ print('[No start ts found for %s]' % frame_id)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ continue@@@", |
| "@@@STEP_LOG_LINE@python.inline@ current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_frames += 1@@@", |
| "@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status.append(@@@", |
| "@@@STEP_LOG_LINE@python.inline@ (frame_id, current_frame_duration, args['termination_status']))@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if(args['termination_status'] == 'missed_frame' or@@@", |
| "@@@STEP_LOG_LINE@python.inline@ args['termination_status'] == 'submitted_frame'):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_id_and_duration.append((frame_id, current_frame_duration))@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@ # We are done with this frame_id so remove it from the dict.@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ print('%d (%s with %s): %d' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_frames, frame_id, args['termination_status'],@@@", |
| "@@@STEP_LOG_LINE@python.inline@ current_frame_duration))@@@", |
| "@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@", |
| "@@@STEP_LOG_LINE@python.inline@ erroneous_termination_statuses):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ # Invalidate previously collected results for this frame_id.@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if frame_id_to_start_ts.get(frame_id):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ print('[Invalidating %s due to %s]' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id, args['termination_status']))@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Calculate metrics for total completed frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@total_completed_frames = len(completed_frame_id_and_duration_status)@@@", |
| "@@@STEP_LOG_LINE@python.inline@if total_completed_frames < 25:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d frames' %@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_completed_frames)@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Get frame avg/min/max for the middle 25 frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@start = (total_completed_frames - 25)/2@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('Got %d total completed frames. Using indexes [%d, %d).' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_completed_frames, start, start+25))@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_max = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_min = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_cumulative = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@aborted_frames = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@for frame_id, duration, status in (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status[start:start+25]):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_max = max(frame_max, duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_min = min(frame_min, duration) if frame_min else duration@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_cumulative += duration@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if status == 'main_frame_aborted':@@@", |
| "@@@STEP_LOG_LINE@python.inline@ aborted_frames += 1@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results = {}@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['frame_max_us'] = frame_max@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['frame_min_us'] = frame_min@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['frame_avg_us'] = frame_cumulative/25@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['aborted_frames'] = aborted_frames@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Now calculate metrics for only drawn frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_max = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_min = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_cumulative = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@total_drawn_frames = len(drawn_frame_id_and_duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@if total_drawn_frames < 25:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d drawn frames' %@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_drawn_frames)@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Get drawn frame avg/min/max from the middle 25 frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@start = (total_drawn_frames - 25)/2@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('Got %d total drawn frames. Using indexes [%d-%d).' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_drawn_frames, start, start+25))@@@", |
| "@@@STEP_LOG_LINE@python.inline@for frame_id, duration in drawn_frame_id_and_duration[start:start+25]:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_max = max(drawn_frame_max, duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_min = (min(drawn_frame_min, duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if drawn_frame_min else duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_cumulative += duration@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Add metrics to perf_results.@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_max_us'] = drawn_frame_max@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_min_us'] = drawn_frame_min@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('Final perf_results dict: %s' % perf_results)@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Write perf_results to the output json.@@@", |
| "@@@STEP_LOG_LINE@python.inline@with open(output_json_file, 'w') as f:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ f.write(json.dumps(perf_results))@@@", |
| "@@@STEP_LOG_END@python.inline@@@" |
| ] |
| }, |
| { |
| "cmd": [ |
| "[START_DIR]/node/node/bin/node", |
| "[START_DIR]/skia/tools/lottie-web-perf/lottie-web-perf.js", |
| "--backend", |
| "svg", |
| "--input", |
| "[START_DIR]/lottie-samples/lottie3.json", |
| "--output", |
| "[CLEANUP]/g3_try_tmp_1/lottie3.json" |
| ], |
| "cwd": "[START_DIR]/skia/tools/lottie-web-perf", |
| "env": { |
| "CHROME_HEADLESS": "1", |
| "DISPLAY": ":0", |
| "PATH": "<PATH>:RECIPE_REPO[depot_tools]" |
| }, |
| "infra_step": true, |
| "name": "Run perf cmd line app (3)" |
| }, |
| { |
| "cmd": [ |
| "python", |
| "-u", |
| "\nimport json\nimport sys\n\ntrace_output = sys.argv[1]\nwith open(trace_output, 'r') as f:\n trace_json = json.load(f)\noutput_json_file = sys.argv[2]\nrenderer = sys.argv[3] # Unused for now but might be useful in the future.\n\n# Output data about the GPU that was used.\nprint('GPU data:')\nprint(trace_json['metadata'].get('gpu-gl-renderer'))\nprint(trace_json['metadata'].get('gpu-driver'))\nprint(trace_json['metadata'].get('gpu-gl-vendor'))\n\nerroneous_termination_statuses = [\n 'replaced_by_new_reporter_at_same_stage',\n 'did_not_produce_frame',\n]\naccepted_termination_statuses = [\n 'missed_frame',\n 'submitted_frame',\n 'main_frame_aborted'\n]\n\ncurrent_frame_duration = 0\ntotal_frames = 0\nframe_id_to_start_ts = {}\n# Will contain tuples of frame_ids and their duration and status.\ncompleted_frame_id_and_duration_status = []\n# Will contain tuples of drawn frame_ids and their duration.\ndrawn_frame_id_and_duration = []\nfor trace in trace_json['traceEvents']:\n if 'PipelineReporter' in trace['name']:\n frame_id = trace['id']\n args = trace.get('args')\n if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':\n frame_id_to_start_ts[frame_id] = trace['ts']\n elif args and (args.get('termination_status') in\n accepted_termination_statuses):\n if not frame_id_to_start_ts.get(frame_id):\n print('[No start ts found for %s]' % frame_id)\n continue\n current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]\n total_frames += 1\n completed_frame_id_and_duration_status.append(\n (frame_id, current_frame_duration, args['termination_status']))\n if(args['termination_status'] == 'missed_frame' or\n args['termination_status'] == 'submitted_frame'):\n drawn_frame_id_and_duration.append((frame_id, current_frame_duration))\n\n # We are done with this frame_id so remove it from the dict.\n frame_id_to_start_ts.pop(frame_id)\n print('%d (%s with %s): %d' % (\n total_frames, frame_id, args['termination_status'],\n current_frame_duration))\n elif args and (args.get('termination_status') in\n erroneous_termination_statuses):\n # Invalidate previously collected results for this frame_id.\n if frame_id_to_start_ts.get(frame_id):\n print('[Invalidating %s due to %s]' % (\n frame_id, args['termination_status']))\n frame_id_to_start_ts.pop(frame_id)\n\n# Calculate metrics for total completed frames.\ntotal_completed_frames = len(completed_frame_id_and_duration_status)\nif total_completed_frames < 25:\n raise Exception('Even with 3 loops found only %d frames' %\n total_completed_frames)\n# Get frame avg/min/max for the middle 25 frames.\nstart = (total_completed_frames - 25)/2\nprint('Got %d total completed frames. Using indexes [%d, %d).' % (\n total_completed_frames, start, start+25))\nframe_max = 0\nframe_min = 0\nframe_cumulative = 0\naborted_frames = 0\nfor frame_id, duration, status in (\n completed_frame_id_and_duration_status[start:start+25]):\n frame_max = max(frame_max, duration)\n frame_min = min(frame_min, duration) if frame_min else duration\n frame_cumulative += duration\n if status == 'main_frame_aborted':\n aborted_frames += 1\n\nperf_results = {}\nperf_results['frame_max_us'] = frame_max\nperf_results['frame_min_us'] = frame_min\nperf_results['frame_avg_us'] = frame_cumulative/25\nperf_results['aborted_frames'] = aborted_frames\n\n# Now calculate metrics for only drawn frames.\ndrawn_frame_max = 0\ndrawn_frame_min = 0\ndrawn_frame_cumulative = 0\ntotal_drawn_frames = len(drawn_frame_id_and_duration)\nif total_drawn_frames < 25:\n raise Exception('Even with 3 loops found only %d drawn frames' %\n total_drawn_frames)\n# Get drawn frame avg/min/max from the middle 25 frames.\nstart = (total_drawn_frames - 25)/2\nprint('Got %d total drawn frames. Using indexes [%d-%d).' % (\n total_drawn_frames, start, start+25))\nfor frame_id, duration in drawn_frame_id_and_duration[start:start+25]:\n drawn_frame_max = max(drawn_frame_max, duration)\n drawn_frame_min = (min(drawn_frame_min, duration)\n if drawn_frame_min else duration)\n drawn_frame_cumulative += duration\n# Add metrics to perf_results.\nperf_results['drawn_frame_max_us'] = drawn_frame_max\nperf_results['drawn_frame_min_us'] = drawn_frame_min\nperf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25\n\nprint('Final perf_results dict: %s' % perf_results)\n\n# Write perf_results to the output json.\nwith open(output_json_file, 'w') as f:\n f.write(json.dumps(perf_results))\n", |
| "[CLEANUP]/g3_try_tmp_1/lottie3.json", |
| "/path/to/tmp/json", |
| "lottie-web" |
| ], |
| "env": { |
| "CHROME_HEADLESS": "1", |
| "PATH": "<PATH>:RECIPE_REPO[depot_tools]" |
| }, |
| "name": "parse lottie3.json trace", |
| "~followup_annotations": [ |
| "@@@STEP_LOG_LINE@json.output@{@@@", |
| "@@@STEP_LOG_LINE@json.output@ \"frame_avg_us\": 179.71, @@@", |
| "@@@STEP_LOG_LINE@json.output@ \"frame_max_us\": 218.25, @@@", |
| "@@@STEP_LOG_LINE@json.output@ \"frame_min_us\": 141.17@@@", |
| "@@@STEP_LOG_LINE@json.output@}@@@", |
| "@@@STEP_LOG_END@json.output@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@import json@@@", |
| "@@@STEP_LOG_LINE@python.inline@import sys@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@trace_output = sys.argv[1]@@@", |
| "@@@STEP_LOG_LINE@python.inline@with open(trace_output, 'r') as f:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ trace_json = json.load(f)@@@", |
| "@@@STEP_LOG_LINE@python.inline@output_json_file = sys.argv[2]@@@", |
| "@@@STEP_LOG_LINE@python.inline@renderer = sys.argv[3] # Unused for now but might be useful in the future.@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Output data about the GPU that was used.@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('GPU data:')@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(trace_json['metadata'].get('gpu-gl-renderer'))@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(trace_json['metadata'].get('gpu-driver'))@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(trace_json['metadata'].get('gpu-gl-vendor'))@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@erroneous_termination_statuses = [@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'replaced_by_new_reporter_at_same_stage',@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'did_not_produce_frame',@@@", |
| "@@@STEP_LOG_LINE@python.inline@]@@@", |
| "@@@STEP_LOG_LINE@python.inline@accepted_termination_statuses = [@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'missed_frame',@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'submitted_frame',@@@", |
| "@@@STEP_LOG_LINE@python.inline@ 'main_frame_aborted'@@@", |
| "@@@STEP_LOG_LINE@python.inline@]@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@current_frame_duration = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@total_frames = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_id_to_start_ts = {}@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Will contain tuples of frame_ids and their duration and status.@@@", |
| "@@@STEP_LOG_LINE@python.inline@completed_frame_id_and_duration_status = []@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Will contain tuples of drawn frame_ids and their duration.@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_id_and_duration = []@@@", |
| "@@@STEP_LOG_LINE@python.inline@for trace in trace_json['traceEvents']:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if 'PipelineReporter' in trace['name']:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id = trace['id']@@@", |
| "@@@STEP_LOG_LINE@python.inline@ args = trace.get('args')@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if args and args.get('step') == 'BeginImplFrameToSendBeginMainFrame':@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts[frame_id] = trace['ts']@@@", |
| "@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@", |
| "@@@STEP_LOG_LINE@python.inline@ accepted_termination_statuses):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if not frame_id_to_start_ts.get(frame_id):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ print('[No start ts found for %s]' % frame_id)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ continue@@@", |
| "@@@STEP_LOG_LINE@python.inline@ current_frame_duration = trace['ts'] - frame_id_to_start_ts[frame_id]@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_frames += 1@@@", |
| "@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status.append(@@@", |
| "@@@STEP_LOG_LINE@python.inline@ (frame_id, current_frame_duration, args['termination_status']))@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if(args['termination_status'] == 'missed_frame' or@@@", |
| "@@@STEP_LOG_LINE@python.inline@ args['termination_status'] == 'submitted_frame'):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_id_and_duration.append((frame_id, current_frame_duration))@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@ # We are done with this frame_id so remove it from the dict.@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ print('%d (%s with %s): %d' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_frames, frame_id, args['termination_status'],@@@", |
| "@@@STEP_LOG_LINE@python.inline@ current_frame_duration))@@@", |
| "@@@STEP_LOG_LINE@python.inline@ elif args and (args.get('termination_status') in@@@", |
| "@@@STEP_LOG_LINE@python.inline@ erroneous_termination_statuses):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ # Invalidate previously collected results for this frame_id.@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if frame_id_to_start_ts.get(frame_id):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ print('[Invalidating %s due to %s]' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id, args['termination_status']))@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_id_to_start_ts.pop(frame_id)@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Calculate metrics for total completed frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@total_completed_frames = len(completed_frame_id_and_duration_status)@@@", |
| "@@@STEP_LOG_LINE@python.inline@if total_completed_frames < 25:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d frames' %@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_completed_frames)@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Get frame avg/min/max for the middle 25 frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@start = (total_completed_frames - 25)/2@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('Got %d total completed frames. Using indexes [%d, %d).' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_completed_frames, start, start+25))@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_max = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_min = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@frame_cumulative = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@aborted_frames = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@for frame_id, duration, status in (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ completed_frame_id_and_duration_status[start:start+25]):@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_max = max(frame_max, duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_min = min(frame_min, duration) if frame_min else duration@@@", |
| "@@@STEP_LOG_LINE@python.inline@ frame_cumulative += duration@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if status == 'main_frame_aborted':@@@", |
| "@@@STEP_LOG_LINE@python.inline@ aborted_frames += 1@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results = {}@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['frame_max_us'] = frame_max@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['frame_min_us'] = frame_min@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['frame_avg_us'] = frame_cumulative/25@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['aborted_frames'] = aborted_frames@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Now calculate metrics for only drawn frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_max = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_min = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@drawn_frame_cumulative = 0@@@", |
| "@@@STEP_LOG_LINE@python.inline@total_drawn_frames = len(drawn_frame_id_and_duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@if total_drawn_frames < 25:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ raise Exception('Even with 3 loops found only %d drawn frames' %@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_drawn_frames)@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Get drawn frame avg/min/max from the middle 25 frames.@@@", |
| "@@@STEP_LOG_LINE@python.inline@start = (total_drawn_frames - 25)/2@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('Got %d total drawn frames. Using indexes [%d-%d).' % (@@@", |
| "@@@STEP_LOG_LINE@python.inline@ total_drawn_frames, start, start+25))@@@", |
| "@@@STEP_LOG_LINE@python.inline@for frame_id, duration in drawn_frame_id_and_duration[start:start+25]:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_max = max(drawn_frame_max, duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_min = (min(drawn_frame_min, duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ if drawn_frame_min else duration)@@@", |
| "@@@STEP_LOG_LINE@python.inline@ drawn_frame_cumulative += duration@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Add metrics to perf_results.@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_max_us'] = drawn_frame_max@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_min_us'] = drawn_frame_min@@@", |
| "@@@STEP_LOG_LINE@python.inline@perf_results['drawn_frame_avg_us'] = drawn_frame_cumulative/25@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@print('Final perf_results dict: %s' % perf_results)@@@", |
| "@@@STEP_LOG_LINE@python.inline@@@@", |
| "@@@STEP_LOG_LINE@python.inline@# Write perf_results to the output json.@@@", |
| "@@@STEP_LOG_LINE@python.inline@with open(output_json_file, 'w') as f:@@@", |
| "@@@STEP_LOG_LINE@python.inline@ f.write(json.dumps(perf_results))@@@", |
| "@@@STEP_LOG_END@python.inline@@@" |
| ] |
| }, |
| { |
| "cmd": [ |
| "python", |
| "-u", |
| "import os\nprint(os.environ.get('SWARMING_BOT_ID', ''))\n" |
| ], |
| "name": "get swarming bot id", |
| "~followup_annotations": [ |
| "@@@STEP_LOG_LINE@python.inline@import os@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(os.environ.get('SWARMING_BOT_ID', ''))@@@", |
| "@@@STEP_LOG_END@python.inline@@@" |
| ] |
| }, |
| { |
| "cmd": [ |
| "python", |
| "-u", |
| "import os\nprint(os.environ.get('SWARMING_TASK_ID', ''))\n" |
| ], |
| "name": "get swarming task id", |
| "~followup_annotations": [ |
| "@@@STEP_LOG_LINE@python.inline@import os@@@", |
| "@@@STEP_LOG_LINE@python.inline@print(os.environ.get('SWARMING_TASK_ID', ''))@@@", |
| "@@@STEP_LOG_END@python.inline@@@" |
| ] |
| }, |
| { |
| "cmd": [ |
| "vpython", |
| "-u", |
| "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py", |
| "--json-output", |
| "/path/to/tmp/json", |
| "ensure-directory", |
| "--mode", |
| "0777", |
| "[START_DIR]/[SWARM_OUT_DIR]" |
| ], |
| "infra_step": true, |
| "name": "makedirs perf_dir" |
| }, |
| { |
| "cmd": [ |
| "vpython", |
| "-u", |
| "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py", |
| "--json-output", |
| "/path/to/tmp/json", |
| "copy", |
| "{\n \"gitHash\": \"abc123\",\n \"issue\": 1234,\n \"key\": {\n \"arch\": \"x86_64\",\n \"bench_type\": \"tracing\",\n \"compiler\": \"none\",\n \"configuration\": \"Release\",\n \"cpu_or_gpu\": \"CPU\",\n \"cpu_or_gpu_value\": \"AVX2\",\n \"extra_config\": \"LottieWeb\",\n \"model\": \"GCE\",\n \"os\": \"Debian10\",\n \"source_type\": \"lottie-web\"\n },\n \"patch_storage\": \"gerrit\",\n \"patchset\": 7,\n \"renderer\": \"lottie-web\",\n \"results\": {\n \"lottie1.json\": {\n \"gl\": {\n \"frame_avg_us\": 179.71,\n \"frame_max_us\": 218.25,\n \"frame_min_us\": 141.17\n }\n },\n \"lottie2.json\": {\n \"gl\": {\n \"frame_avg_us\": 179.71,\n \"frame_max_us\": 218.25,\n \"frame_min_us\": 141.17\n }\n },\n \"lottie3.json\": {\n \"gl\": {\n \"frame_avg_us\": 179.71,\n \"frame_max_us\": 218.25,\n \"frame_min_us\": 141.17\n }\n }\n },\n \"swarming_bot_id\": \"\",\n \"swarming_task_id\": \"\"\n}", |
| "[START_DIR]/[SWARM_OUT_DIR]/perf_abc123_1337000001.json" |
| ], |
| "infra_step": true, |
| "name": "write output JSON", |
| "~followup_annotations": [ |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@{@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"gitHash\": \"abc123\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"issue\": 1234,@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"key\": {@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"arch\": \"x86_64\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"bench_type\": \"tracing\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"compiler\": \"none\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"configuration\": \"Release\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"cpu_or_gpu\": \"CPU\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"cpu_or_gpu_value\": \"AVX2\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"extra_config\": \"LottieWeb\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"model\": \"GCE\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"os\": \"Debian10\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"source_type\": \"lottie-web\"@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ },@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"patch_storage\": \"gerrit\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"patchset\": 7,@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"renderer\": \"lottie-web\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"results\": {@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"lottie1.json\": {@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"gl\": {@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"frame_avg_us\": 179.71,@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"frame_max_us\": 218.25,@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"frame_min_us\": 141.17@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ }@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ },@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"lottie2.json\": {@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"gl\": {@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"frame_avg_us\": 179.71,@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"frame_max_us\": 218.25,@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"frame_min_us\": 141.17@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ }@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ },@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"lottie3.json\": {@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"gl\": {@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"frame_avg_us\": 179.71,@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"frame_max_us\": 218.25,@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"frame_min_us\": 141.17@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ }@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ }@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ },@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"swarming_bot_id\": \"\",@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@ \"swarming_task_id\": \"\"@@@", |
| "@@@STEP_LOG_LINE@perf_abc123_1337000001.json@}@@@", |
| "@@@STEP_LOG_END@perf_abc123_1337000001.json@@@" |
| ] |
| }, |
| { |
| "name": "$result" |
| } |
| ] |