| Index: tools/perf/metrics/smoothness.py
|
| diff --git a/tools/perf/metrics/smoothness.py b/tools/perf/metrics/smoothness.py
|
| index f4ebfbc499390da46078bc65dc774e13a484aa02..e796a97336b8d1856081b96b9638e5c3065764fb 100644
|
| --- a/tools/perf/metrics/smoothness.py
|
| +++ b/tools/perf/metrics/smoothness.py
|
| @@ -52,65 +52,90 @@ class SmoothnessMetrics(object):
|
| 'window.__renderingStats.getDeltas()')
|
|
|
|
|
| -def DivideIfPossibleOrZero(numerator, denominator):
|
| +def _DivideIfPossibleOrZero(numerator, denominator):
|
| if denominator == 0:
|
| return 0
|
| return numerator / denominator
|
|
|
| -def CalcScrollResults(rendering_stats_deltas, results):
|
| - num_frames_sent_to_screen = rendering_stats_deltas['numFramesSentToScreen']
|
|
|
| - mean_frame_time_seconds = (
|
| - rendering_stats_deltas['totalTimeInSeconds'] /
|
| - float(num_frames_sent_to_screen))
|
| -
|
| - dropped_percent = (
|
| - rendering_stats_deltas['droppedFrameCount'] /
|
| - float(num_frames_sent_to_screen))
|
| -
|
| - num_impl_thread_scrolls = rendering_stats_deltas.get(
|
| - 'numImplThreadScrolls', 0)
|
| - num_main_thread_scrolls = rendering_stats_deltas.get(
|
| - 'numMainThreadScrolls', 0)
|
| -
|
| - percent_impl_scrolled = DivideIfPossibleOrZero(
|
| - float(num_impl_thread_scrolls),
|
| - num_impl_thread_scrolls + num_main_thread_scrolls)
|
| -
|
| - num_layers = (
|
| - rendering_stats_deltas.get('numLayersDrawn', 0) /
|
| - float(num_frames_sent_to_screen))
|
| -
|
| - num_missing_tiles = (
|
| - rendering_stats_deltas.get('numMissingTiles', 0) /
|
| - float(num_frames_sent_to_screen))
|
| -
|
| - results.Add('mean_frame_time', 'ms', round(mean_frame_time_seconds * 1000, 3))
|
| +def _AddDeltaResult(deltas, results, stat_name,
|
| + result_name, units, important=False):
|
| + """Add a result from the given deltas object to the results.
|
| +
|
| + Args:
|
| + deltas: Deltas object returned by JS window.__renderingStats.getDeltas().
|
| + results: PageMeasurementResults object.
|
| + stat_name: The attribute name of the statistic in the deltas object.
|
| + result_name: The name of this statistic to give in the results.
|
| + units: The units to give in the results.
|
| + """
|
| + stat_value = deltas.get(stat_name, 0)
|
| + data_type = 'default' if important else 'unimportant'
|
| + results.Add(result_name, units, stat_value, data_type=data_type)
|
| +
|
| +
|
| +def _AddAverageTimeResult(deltas, results, time_s_stat_name, count_stat_name,
|
| + result_name, important=False):
|
| + """Add a result which represents an average time.
|
| +
|
| + Args:
|
| + deltas: Deltas object returned by JS window.__renderingStats.getDeltas().
|
| + results: PageMeasurementResults object.
|
| + time_s_stat_name: The name of a statistic which represents time in seconds
|
| + count_stat_name: The name of a statistic which represents a total count
|
| + result_name: The name of this statistic to give in the results.
|
| + """
|
| + average_time_ms = _DivideIfPossibleOrZero(
|
| + deltas.get(time_s_stat_name, 0) * 1000,
|
| + deltas.get(count_stat_name, 0))
|
| + data_type = 'default' if important else 'unimportant'
|
| + results.Add(result_name, 'ms', average_time_ms, data_type=data_type)
|
| +
|
| +
|
| +def CalcScrollResults(deltas, results):
|
| + num_frames_sent_to_screen = deltas.get('numFramesSentToScreen', 0)
|
| +
|
| + total_time_s = deltas.get('totalTimeInSeconds', 0)
|
| + mean_frame_time_ms = _DivideIfPossibleOrZero(
|
| + float(total_time_s) * 1000, num_frames_sent_to_screen)
|
| + results.Add('mean_frame_time', 'ms', round(mean_frame_time_ms, 3))
|
| +
|
| + dropped_frame_count = deltas.get('droppedFrameCount', 0)
|
| + dropped_percent = _DivideIfPossibleOrZero(
|
| + float(dropped_frame_count), num_frames_sent_to_screen)
|
| results.Add('dropped_percent', '%', round(dropped_percent * 100, 1),
|
| data_type='unimportant')
|
| +
|
| + num_impl_thread_scrolls = deltas.get('numImplThreadScrolls', 0)
|
| + num_main_thread_scrolls = deltas.get('numMainThreadScrolls', 0)
|
| + percent_impl_scrolled = _DivideIfPossibleOrZero(
|
| + float(num_impl_thread_scrolls),
|
| + num_impl_thread_scrolls + num_main_thread_scrolls)
|
| results.Add('percent_impl_scrolled', '%',
|
| round(percent_impl_scrolled * 100, 1),
|
| data_type='unimportant')
|
| +
|
| + num_layers_drawn = deltas.get('numLayersDrawn', 0)
|
| + num_layers = _DivideIfPossibleOrZero(
|
| + float(num_layers_drawn), num_frames_sent_to_screen)
|
| results.Add('average_num_layers_drawn', '', round(num_layers, 1),
|
| data_type='unimportant')
|
| +
|
| + num_missing_tiles = deltas.get('numMissingTiles', 0)
|
| + num_missing_tiles = _DivideIfPossibleOrZero(
|
| + float(num_missing_tiles), num_frames_sent_to_screen)
|
| results.Add('average_num_missing_tiles', '', round(num_missing_tiles, 1),
|
| data_type='unimportant')
|
|
|
| -def CalcTextureUploadResults(rendering_stats_deltas, results):
|
| - if (('totalCommitCount' not in rendering_stats_deltas)
|
| - or rendering_stats_deltas['totalCommitCount'] == 0) :
|
| - averageCommitTimeMs = 0
|
| - else :
|
| - averageCommitTimeMs = (
|
| - 1000 * rendering_stats_deltas['totalCommitTimeInSeconds'] /
|
| - rendering_stats_deltas['totalCommitCount'])
|
| -
|
| - results.Add('texture_upload_count', 'count',
|
| - rendering_stats_deltas.get('textureUploadCount', 0))
|
| - results.Add('total_texture_upload_time', 'seconds',
|
| - rendering_stats_deltas.get('totalTextureUploadTimeInSeconds', 0))
|
| - results.Add('average_commit_time', 'ms', averageCommitTimeMs,
|
| - data_type='unimportant')
|
| +
|
| +def CalcTextureUploadResults(deltas, results):
|
| + _AddDeltaResult(deltas, results, 'textureUploadCount',
|
| + 'texture_upload_count', 'count')
|
| + _AddDeltaResult(deltas, results, 'totalTextureUploadTimeInSeconds',
|
| + 'total_texture_upload_time', 'seconds')
|
| + _AddAverageTimeResult(deltas, results, 'totalCommitTimeInSeconds',
|
| + 'totalCommitCount', 'average_commit_time')
|
| +
|
|
|
| def CalcFirstPaintTimeResults(results, tab):
|
| if tab.browser.is_content_shell:
|
| @@ -121,8 +146,7 @@ def CalcFirstPaintTimeResults(results, tab):
|
| window.__rafFired = false;
|
| window.webkitRequestAnimationFrame(function() {
|
| window.__rafFired = true;
|
| - });
|
| - """)
|
| + }); """)
|
| util.WaitFor(lambda: tab.EvaluateJavaScript('window.__rafFired'), 60)
|
|
|
| first_paint_secs = tab.EvaluateJavaScript(
|
| @@ -131,72 +155,35 @@ def CalcFirstPaintTimeResults(results, tab):
|
|
|
| results.Add('first_paint', 'ms', round(first_paint_secs * 1000, 1))
|
|
|
| -def CalcImageDecodingResults(rendering_stats_deltas, results):
|
| - totalDeferredImageDecodeCount = rendering_stats_deltas.get(
|
| - 'totalDeferredImageDecodeCount', 0)
|
| - totalDeferredImageCacheHitCount = rendering_stats_deltas.get(
|
| - 'totalDeferredImageCacheHitCount', 0)
|
| - totalImageGatheringCount = rendering_stats_deltas.get(
|
| - 'totalImageGatheringCount', 0)
|
| - totalDeferredImageDecodeTimeInSeconds = rendering_stats_deltas.get(
|
| - 'totalDeferredImageDecodeTimeInSeconds', 0)
|
| - totalImageGatheringTimeInSeconds = rendering_stats_deltas.get(
|
| - 'totalImageGatheringTimeInSeconds', 0)
|
| -
|
| - averageImageGatheringTime = DivideIfPossibleOrZero(
|
| - (totalImageGatheringTimeInSeconds * 1000), totalImageGatheringCount)
|
| -
|
| - results.Add('total_deferred_image_decode_count', 'count',
|
| - totalDeferredImageDecodeCount,
|
| - data_type='unimportant')
|
| - results.Add('total_image_cache_hit_count', 'count',
|
| - totalDeferredImageCacheHitCount,
|
| - data_type='unimportant')
|
| - results.Add('average_image_gathering_time', 'ms', averageImageGatheringTime,
|
| - data_type='unimportant')
|
| - results.Add('total_deferred_image_decoding_time', 'seconds',
|
| - totalDeferredImageDecodeTimeInSeconds,
|
| - data_type='unimportant')
|
| -
|
| -def CalcAnalysisResults(rendering_stats_deltas, results):
|
| - totalTilesAnalyzed = rendering_stats_deltas.get(
|
| - 'totalTilesAnalyzed', 0)
|
| - solidColorTilesAnalyzed = rendering_stats_deltas.get(
|
| - 'solidColorTilesAnalyzed', 0)
|
| - totalTileAnalysisTimeInSeconds = rendering_stats_deltas.get(
|
| - 'totalTileAnalysisTimeInSeconds', 0)
|
| -
|
| - averageAnalysisTimeMS = \
|
| - 1000 * DivideIfPossibleOrZero(totalTileAnalysisTimeInSeconds,
|
| - totalTilesAnalyzed)
|
|
|
| - results.Add('total_tiles_analyzed', 'count',
|
| - totalTilesAnalyzed,
|
| - data_type='unimportant')
|
| - results.Add('solid_color_tiles_analyzed', 'count',
|
| - solidColorTilesAnalyzed,
|
| - data_type='unimportant')
|
| - results.Add('average_tile_analysis_time', 'ms',
|
| - averageAnalysisTimeMS,
|
| - data_type='unimportant')
|
| +def CalcImageDecodingResults(deltas, results):
|
| + _AddDeltaResult(deltas, results, 'totalDeferredImageDecodeCount',
|
| + 'total_deferred_image_decode_count', 'count')
|
| + _AddDeltaResult(deltas, results, 'totalDeferredImageCacheHitCount',
|
| + 'total_image_cache_hit_count', 'count')
|
| + _AddAverageTimeResult(deltas, results, 'totalImageGatheringTimeInSeconds',
|
| + 'totalImageGatheringCount',
|
| + 'average_image_gathering_time')
|
| + _AddDeltaResult(deltas, results, 'totalDeferredImageDecodeTimeInSeconds',
|
| + 'total_deferred_image_decoding_time', 'seconds')
|
| +
|
| +
|
| +def CalcAnalysisResults(deltas, results):
|
| + _AddDeltaResult(deltas, results, 'totalTilesAnalayzed',
|
| + 'total_tiles_analyzed', 'count')
|
| + _AddDeltaResult(deltas, results, 'solidColorTilesAnalayzed',
|
| + 'solid_color_tiles_analyzed', 'count')
|
| + _AddAverageTimeResult(deltas, results, 'totalTileAnalysisTimeInSeconds',
|
| + 'totalTilesAnalyzed', 'average_tile_analysis_time')
|
| +
|
| +
|
| +def CalcLatencyResults(deltas, results):
|
| + _AddAverageTimeResult(deltas, results, 'totalInputLatency',
|
| + 'inputEventCount', 'average_latency')
|
| + _AddAverageTimeResult(deltas, results, 'totalTouchUILatency',
|
| + 'touchUICount', 'average_touch_ui_latency')
|
| + _AddAverageTimeResult(deltas, results, 'totalTouchAckedLatency',
|
| + 'touchAckedCount', 'average_touch_acked_latency')
|
| + _AddAverageTimeResult(deltas, results, 'totalScrollUpdateLatency',
|
| + 'scrollUpdateCount', 'average_scroll_update_latency')
|
|
|
| -def CalcLatency(rendering_stats_deltas, count_name, total_latency_name,
|
| - result_name, results):
|
| - eventCount = rendering_stats_deltas.get(count_name, 0)
|
| - totalLatencyInSeconds = rendering_stats_deltas.get(total_latency_name, 0)
|
| - averageLatency = DivideIfPossibleOrZero(
|
| - (totalLatencyInSeconds * 1000), eventCount)
|
| - results.Add(result_name, 'ms', averageLatency, data_type='unimportant')
|
| -
|
| -def CalcLatencyResults(rendering_stats_deltas, results):
|
| - CalcLatency(rendering_stats_deltas, 'inputEventCount', 'totalInputLatency',
|
| - 'average_latency', results)
|
| - CalcLatency(rendering_stats_deltas, 'touchUICount', 'totalTouchUILatency',
|
| - 'average_touch_ui_latency', results)
|
| - CalcLatency(rendering_stats_deltas, 'touchAckedCount',
|
| - 'totalTouchAckedLatency',
|
| - 'average_touch_acked_latency',
|
| - results)
|
| - CalcLatency(rendering_stats_deltas, 'scrollUpdateCount',
|
| - 'totalScrollUpdateLatency',
|
| - 'average_scroll_update_latency', results)
|
|
|