| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 from telemetry import multi_page_benchmark | 4 from telemetry import multi_page_benchmark |
| 5 from telemetry import util |
| 5 | 6 |
| 6 class DidNotScrollException(multi_page_benchmark.MeasurementFailure): | 7 class DidNotScrollException(multi_page_benchmark.MeasurementFailure): |
| 7 def __init__(self): | 8 def __init__(self): |
| 8 super(DidNotScrollException, self).__init__('Page did not scroll') | 9 super(DidNotScrollException, self).__init__('Page did not scroll') |
| 9 | 10 |
| 10 def GetOrZero(stat, rendering_stats_deltas): | 11 def GetOrZero(stat, rendering_stats_deltas): |
| 11 if stat in rendering_stats_deltas: | 12 if stat in rendering_stats_deltas: |
| 12 return rendering_stats_deltas[stat] | 13 return rendering_stats_deltas[stat] |
| 13 return 0 | 14 return 0 |
| 14 | 15 |
| 15 def DivideIfPossibleOrZero(numerator, denominator): | 16 def DivideIfPossibleOrZero(numerator, denominator): |
| 16 if denominator == 0: | 17 if denominator == 0: |
| 17 return 0 | 18 return 0 |
| 18 return numerator / denominator | 19 return numerator / denominator |
| 19 | 20 |
| 20 def CalcScrollResults(rendering_stats_deltas, results): | 21 def CalcScrollResults(rendering_stats_deltas, results): |
| 21 num_frames_sent_to_screen = rendering_stats_deltas['numFramesSentToScreen'] | 22 num_frames_sent_to_screen = rendering_stats_deltas['numFramesSentToScreen'] |
| 22 | 23 |
| 23 mean_frame_time_seconds = ( | 24 mean_frame_time_seconds = ( |
| 24 rendering_stats_deltas['totalTimeInSeconds'] / | 25 rendering_stats_deltas['totalTimeInSeconds'] / |
| 25 float(num_frames_sent_to_screen)) | 26 float(num_frames_sent_to_screen)) |
| 26 | 27 |
| 27 dropped_percent = ( | 28 dropped_percent = ( |
| 28 rendering_stats_deltas['droppedFrameCount'] / | 29 rendering_stats_deltas['droppedFrameCount'] / |
| 29 float(num_frames_sent_to_screen)) | 30 float(num_frames_sent_to_screen)) |
| 30 | 31 |
| 32 results.Add('mean_frame_time', 'ms', round(mean_frame_time_seconds * 1000, 3)) |
| 33 results.Add('dropped_percent', '%', round(dropped_percent * 100, 1), |
| 34 data_type='unimportant') |
| 31 | 35 |
| 36 |
| 37 def CalcPaintingResults(rendering_stats_deltas, results): |
| 32 totalPaintTime = GetOrZero('totalPaintTimeInSeconds', | 38 totalPaintTime = GetOrZero('totalPaintTimeInSeconds', |
| 33 rendering_stats_deltas) | 39 rendering_stats_deltas) |
| 34 | 40 |
| 35 totalRasterizeTime = GetOrZero('totalRasterizeTimeInSeconds', | 41 totalRasterizeTime = GetOrZero('totalRasterizeTimeInSeconds', |
| 36 rendering_stats_deltas) | 42 rendering_stats_deltas) |
| 37 | 43 |
| 38 totalPixelsPainted = GetOrZero('totalPixelsPainted', | 44 totalPixelsPainted = GetOrZero('totalPixelsPainted', |
| 39 rendering_stats_deltas) | 45 rendering_stats_deltas) |
| 40 | 46 |
| 41 totalPixelsRasterized = GetOrZero('totalPixelsRasterized', | 47 totalPixelsRasterized = GetOrZero('totalPixelsRasterized', |
| 42 rendering_stats_deltas) | 48 rendering_stats_deltas) |
| 43 | 49 |
| 44 | |
| 45 megapixelsPaintedPerSecond = DivideIfPossibleOrZero( | 50 megapixelsPaintedPerSecond = DivideIfPossibleOrZero( |
| 46 (totalPixelsPainted / 1000000.0), totalPaintTime) | 51 (totalPixelsPainted / 1000000.0), totalPaintTime) |
| 47 | 52 |
| 48 megapixelsRasterizedPerSecond = DivideIfPossibleOrZero( | 53 megapixelsRasterizedPerSecond = DivideIfPossibleOrZero( |
| 49 (totalPixelsRasterized / 1000000.0), totalRasterizeTime) | 54 (totalPixelsRasterized / 1000000.0), totalRasterizeTime) |
| 50 | 55 |
| 51 results.Add('mean_frame_time', 'ms', round(mean_frame_time_seconds * 1000, 3)) | 56 results.Add('total_paint_time', 'seconds', totalPaintTime) |
| 52 results.Add('dropped_percent', '%', round(dropped_percent * 100, 1)) | 57 results.Add('total_rasterize_time', 'seconds', totalRasterizeTime, |
| 58 data_type='unimportant') |
| 59 results.Add('total_pixels_painted', '', totalPixelsPainted, |
| 60 data_type='unimportant') |
| 61 results.Add('total_pixels_rasterized', '', totalPixelsRasterized, |
| 62 data_type='unimportant') |
| 63 results.Add('megapixels_painted_per_second', '', megapixelsPaintedPerSecond, |
| 64 data_type='unimportant') |
| 65 results.Add('megapixels_rasterized_per_second', '', |
| 66 megapixelsRasterizedPerSecond, data_type='unimportant') |
| 67 results.Add('total_paint_and_rasterize_time', 'seconds', totalPaintTime + |
| 68 totalRasterizeTime, data_type='unimportant') |
| 53 | 69 |
| 54 results.Add('total_paint_time', 'seconds', totalPaintTime) | 70 def CalcTextureUploadResults(rendering_stats_deltas, results): |
| 55 results.Add('total_rasterize_time', 'seconds', totalRasterizeTime) | 71 if (('totalCommitCount' not in rendering_stats_deltas) |
| 56 results.Add('total_pixels_painted', '', totalPixelsPainted) | 72 or rendering_stats_deltas['totalCommitCount'] == 0) : |
| 57 results.Add('total_pixels_rasterized', '', totalPixelsRasterized) | 73 averageCommitTimeMs = 0 |
| 58 results.Add('megapixels_painted_per_second', '', megapixelsPaintedPerSecond) | 74 else : |
| 59 results.Add('megapixels_rasterized_per_second', '', | 75 averageCommitTimeMs = ( |
| 60 megapixelsRasterizedPerSecond) | 76 1000 * rendering_stats_deltas['totalCommitTimeInSeconds'] / |
| 61 results.Add('total_paint_and_rasterize_time', 'seconds', totalPaintTime + | 77 rendering_stats_deltas['totalCommitCount']) |
| 62 totalRasterizeTime) | |
| 63 | 78 |
| 64 class ScrollingBenchmark(multi_page_benchmark.MultiPageBenchmark): | 79 results.Add('texture_upload_count', 'count', |
| 80 GetOrZero('textureUploadCount', rendering_stats_deltas)) |
| 81 results.Add('average_commit_time', 'ms', averageCommitTimeMs, |
| 82 data_type='unimportant') |
| 83 |
| 84 def CalcFirstPaintTimeResults(results, tab): |
| 85 if tab.browser.is_content_shell: |
| 86 results.Add('first_paint', 'ms', 'unsupported') |
| 87 return |
| 88 |
| 89 tab.runtime.Execute(""" |
| 90 window.__rafFired = false; |
| 91 window.webkitRequestAnimationFrame(function() { |
| 92 window.__rafFired = true; |
| 93 }); |
| 94 """) |
| 95 util.WaitFor(lambda: tab.runtime.Evaluate('window.__rafFired'), 60) |
| 96 |
| 97 first_paint_secs = tab.runtime.Evaluate( |
| 98 'window.chrome.loadTimes().firstPaintTime - ' + |
| 99 'window.chrome.loadTimes().requestTime') |
| 100 |
| 101 results.Add('first_paint', 'ms', round(first_paint_secs * 1000, 1)) |
| 102 |
| 103 class SmoothnessBenchmark(multi_page_benchmark.MultiPageBenchmark): |
| 65 def __init__(self): | 104 def __init__(self): |
| 66 super(ScrollingBenchmark, self).__init__('scrolling') | 105 super(SmoothnessBenchmark, self).__init__('scrolling') |
| 67 | 106 |
| 68 def AddCommandLineOptions(self, parser): | 107 def AddCommandLineOptions(self, parser): |
| 69 parser.add_option('--no-gpu-benchmarking-extension', action='store_true', | 108 parser.add_option('--no-gpu-benchmarking-extension', action='store_true', |
| 70 dest='no_gpu_benchmarking_extension', | 109 dest='no_gpu_benchmarking_extension', |
| 71 help='Disable the chrome.gpuBenchmarking extension.') | 110 help='Disable the chrome.gpuBenchmarking extension.') |
| 72 parser.add_option('--report-all-results', dest='report_all_results', | 111 parser.add_option('--report-all-results', dest='report_all_results', |
| 73 action='store_true', | 112 action='store_true', |
| 74 help='Reports all data collected, not just FPS') | 113 help='Reports all data collected, not just FPS') |
| 75 | 114 |
| 76 def CustomizeBrowserOptions(self, options): | 115 def CustomizeBrowserOptions(self, options): |
| 77 if not options.no_gpu_benchmarking_extension: | 116 if not options.no_gpu_benchmarking_extension: |
| 78 options.extra_browser_args.append('--enable-gpu-benchmarking') | 117 options.extra_browser_args.append('--enable-gpu-benchmarking') |
| 79 | 118 |
| 80 def CanRunForPage(self, page): | 119 def CanRunForPage(self, page): |
| 81 return hasattr(page, 'scrolling') | 120 return hasattr(page, 'scrolling') |
| 82 | 121 |
| 83 def MeasurePage(self, page, tab, results): | 122 def MeasurePage(self, page, tab, results): |
| 84 rendering_stats_deltas = tab.runtime.Evaluate( | 123 rendering_stats_deltas = tab.runtime.Evaluate( |
| 85 'window.__renderingStatsDeltas') | 124 'window.__renderingStatsDeltas') |
| 86 | 125 |
| 87 if not (rendering_stats_deltas['numFramesSentToScreen'] > 0): | 126 if not (rendering_stats_deltas['numFramesSentToScreen'] > 0): |
| 88 raise DidNotScrollException() | 127 raise DidNotScrollException() |
| 89 | 128 |
| 129 CalcFirstPaintTimeResults(results, tab) |
| 90 CalcScrollResults(rendering_stats_deltas, results) | 130 CalcScrollResults(rendering_stats_deltas, results) |
| 131 CalcPaintingResults(rendering_stats_deltas, results) |
| 132 CalcTextureUploadResults(rendering_stats_deltas, results) |
| 133 |
| 91 if self.options.report_all_results: | 134 if self.options.report_all_results: |
| 92 for k, v in rendering_stats_deltas.iteritems(): | 135 for k, v in rendering_stats_deltas.iteritems(): |
| 93 results.Add(k, '', v) | 136 results.Add(k, '', v) |
| OLD | NEW |