bbh_shootout.cpp revision 1d38ae9162d9702a8999e1fe872ead3e0a3f1181
16645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/* 26645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Copyright 2013 Google Inc. 36645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * 46645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 56645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * found in the LICENSE file. 66645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */ 76645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 86645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "BenchTimer.h" 96645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "LazyDecodeBitmap.h" 106645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "PictureBenchmark.h" 116645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "PictureRenderer.h" 126645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkBenchmark.h" 136645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkForceLinking.h" 146645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkGraphics.h" 156645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkStream.h" 166645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "SkString.h" 176645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org#include "TimerData.h" 186645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 196645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const int kNumNormalRecordings = SkBENCHLOOP(10); 206645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const int kNumRTreeRecordings = SkBENCHLOOP(10); 216645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const int kNumPlaybacks = SkBENCHLOOP(4); 226645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const size_t kNumBaseBenchmarks = 3; 236645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const size_t kNumTileSizes = 3; 246645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const size_t kNumBbhPlaybackBenchmarks = 3; 256645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic const size_t kNumBenchmarks = kNumBaseBenchmarks + kNumBbhPlaybackBenchmarks; 266645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 276645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgenum BenchmarkType { 286645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org kNormal_BenchmarkType = 0, 296645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org kRTree_BenchmarkType, 306645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}; 316645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 326645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstruct Histogram { 336645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org Histogram() { 346645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // Make fCpuTime negative so that we don't mess with stats: 356645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org fCpuTime = SkIntToScalar(-1); 366645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 376645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkScalar fCpuTime; 386645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString fPath; 396645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}; 406645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 416645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgtypedef void (*BenchmarkFunction) 426645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org (BenchmarkType, const SkISize&, const SkString&, SkPicture*, BenchTimer*); 436645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 446645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org// Defined below. 456645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void benchmark_playback( 466645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org BenchmarkType, const SkISize&, const SkString&, SkPicture*, BenchTimer*); 476645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void benchmark_recording( 486645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org BenchmarkType, const SkISize&, const SkString&, SkPicture*, BenchTimer*); 496645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 506645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/** 516645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Acts as a POD containing information needed to run a benchmark. 526645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Provides static methods to poll benchmark info from an index. 536645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */ 546645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstruct BenchmarkControl { 556645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkISize fTileSize; 566645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org BenchmarkType fType; 576645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org BenchmarkFunction fFunction; 586645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString fName; 596645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 606645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /** 616645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Will construct a BenchmarkControl instance from an index between 0 an kNumBenchmarks. 626645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */ 636645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org static BenchmarkControl Make(size_t i) { 646645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkASSERT(kNumBenchmarks > i); 656645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org BenchmarkControl benchControl; 666645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org benchControl.fTileSize = getTileSize(i); 676645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org benchControl.fType = getBenchmarkType(i); 686645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org benchControl.fFunction = getBenchmarkFunc(i); 696645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org benchControl.fName = getBenchmarkName(i); 706645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return benchControl; 716645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 726645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 736645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org enum BaseBenchmarks { 746645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org kNormalRecord = 0, 756645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org kRTreeRecord, 766645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org kNormalPlayback, 776645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org }; 786645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 796645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org static SkISize fTileSizes[kNumTileSizes]; 806645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 816645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org static SkISize getTileSize(size_t i) { 826645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // Two of the base benchmarks don't need a tile size. But to maintain simplicity 836645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // down the pipeline we have to let a couple of values unused. 846645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (i < kNumBaseBenchmarks) { 856645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return SkISize::Make(256, 256); 866645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 876645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (i >= kNumBaseBenchmarks && i < kNumBenchmarks) { 886645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return fTileSizes[i - kNumBaseBenchmarks]; 896645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 906645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkASSERT(0); 916645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return SkISize::Make(0, 0); 926645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 936645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 946645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org static BenchmarkType getBenchmarkType(size_t i) { 956645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (i < kNumBaseBenchmarks) { 966645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org switch (i) { 976645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kNormalRecord: 986645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return kNormal_BenchmarkType; 996645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kNormalPlayback: 1006645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return kNormal_BenchmarkType; 1016645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kRTreeRecord: 1026645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return kRTree_BenchmarkType; 1036645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1046645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1056645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (i < kNumBenchmarks) { 1066645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return kRTree_BenchmarkType; 1076645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1086645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkASSERT(0); 1096645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return kRTree_BenchmarkType; 1106645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1116645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 1126645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org static BenchmarkFunction getBenchmarkFunc(size_t i) { 1136645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // Base functions. 1146645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org switch (i) { 1156645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kNormalRecord: 1166645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return benchmark_recording; 1176645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kNormalPlayback: 1186645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return benchmark_playback; 1196645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kRTreeRecord: 1206645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return benchmark_recording; 1216645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1226645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // RTree playbacks 1236645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (i < kNumBenchmarks) { 1246645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return benchmark_playback; 1256645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1266645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkASSERT(0); 1276645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return NULL; 1286645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1296645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 1306645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org static SkString getBenchmarkName(size_t i) { 1316645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // Base benchmark names 1326645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org switch (i) { 1336645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kNormalRecord: 1346645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return SkString("normal_recording"); 1356645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kNormalPlayback: 1366645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return SkString("normal_playback"); 1376645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kRTreeRecord: 1386645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return SkString("rtree_recording"); 1396645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1406645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // RTree benchmark names. 1416645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (i < kNumBenchmarks) { 1426645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkASSERT(i >= kNumBaseBenchmarks); 1436645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString name; 1446645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org name.printf("rtree_playback_%dx%d", 1456645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org fTileSizes[i - kNumBaseBenchmarks].fWidth, 1466645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org fTileSizes[i - kNumBaseBenchmarks].fHeight); 1476645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return name; 1486645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 1496645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } else { 1506645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkASSERT(0); 1516645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1526645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return SkString(""); 1536645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1546645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 1556645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}; 1566645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 1576645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgSkISize BenchmarkControl::fTileSizes[kNumTileSizes] = { 1586645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkISize::Make(256, 256), 1596645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkISize::Make(512, 512), 1606645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkISize::Make(1024, 1024), 1616645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org}; 1626645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 1636645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic SkPicture* pic_from_path(const char path[]) { 1646645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkFILEStream stream(path); 1656645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (!stream.isValid()) { 1666645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkDebugf("-- Can't open '%s'\n", path); 1676645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return NULL; 1686645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1696645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return SkPicture::CreateFromStream(&stream, &sk_tools::LazyDecodeBitmap); 1706645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org} 1716645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 1726645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/** 1736645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * This function is the sink to which all work ends up going. 1746645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Renders the picture into the renderer. It may or may not use an RTree. 1756645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * The renderer is chosen upstream. If we want to measure recording, we will 1766645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * use a RecordPictureRenderer. If we want to measure rendering, we eill use a 1776645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * TiledPictureRenderer. 1786645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */ 1796645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void do_benchmark_work(sk_tools::PictureRenderer* renderer, 1806645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org int benchmarkType, const SkString& path, SkPicture* pic, 1816645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org const int numRepeats, const char *msg, BenchTimer* timer) { 1826645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString msgPrefix; 1836645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 1846645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org switch (benchmarkType){ 1856645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kNormal_BenchmarkType: 1866645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org msgPrefix.set("Normal"); 1876645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org renderer->setBBoxHierarchyType(sk_tools::PictureRenderer::kNone_BBoxHierarchyType); 1886645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org break; 1896645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kRTree_BenchmarkType: 1906645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org msgPrefix.set("RTree"); 1916645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org renderer->setBBoxHierarchyType(sk_tools::PictureRenderer::kRTree_BBoxHierarchyType); 1926645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org break; 1936645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org default: 1946645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkASSERT(0); 1956645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org break; 1966645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 1976645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 1986645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org renderer->init(pic); 1996645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 2006645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /** 2016645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * If the renderer is not tiled, assume we are measuring recording. 2026645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */ 2036645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org bool isPlayback = (NULL != renderer->getTiledRenderer()); 2046645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 2056645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkDebugf("%s %s %s %d times...\n", msgPrefix.c_str(), msg, path.c_str(), numRepeats); 2066645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org for (int i = 0; i < numRepeats; ++i) { 2076645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org renderer->setup(); 2086645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // Render once to fill caches. 2096645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org renderer->render(NULL); 2106645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // Render again to measure 2116645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org timer->start(); 2126645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org bool result = renderer->render(NULL); 2136645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org timer->end(); 2146645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // We only care about a false result on playback. RecordPictureRenderer::render will always 2156645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // return false because we are passing a NULL file name on purpose; which is fine. 2166645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if(isPlayback && !result) { 2176645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkDebugf("Error rendering during playback.\n"); 2186645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 2196645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 2206645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org renderer->end(); 2216645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org} 2226645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 2236645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/** 2246645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Call do_benchmark_work with a tiled renderer using the default tile dimensions. 2256645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */ 2266645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void benchmark_playback( 2276645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org BenchmarkType benchmarkType, const SkISize& tileSize, 2286645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org const SkString& path, SkPicture* pic, BenchTimer* timer) { 2296645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org sk_tools::TiledPictureRenderer renderer; 2306645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 2316645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString message("tiled_playback"); 2326645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org message.appendf("_%dx%d", tileSize.fWidth, tileSize.fHeight); 2336645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org do_benchmark_work(&renderer, benchmarkType, 2346645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org path, pic, kNumPlaybacks, message.c_str(), timer); 2356645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org} 2366645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 2376645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/** 2386645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Call do_benchmark_work with a RecordPictureRenderer. 2396645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */ 2406645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic void benchmark_recording( 2416645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org BenchmarkType benchmarkType, const SkISize& tileSize, 2426645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org const SkString& path, SkPicture* pic, BenchTimer* timer) { 2436645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org sk_tools::RecordPictureRenderer renderer; 2446645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org int numRecordings = 0; 2456645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org switch(benchmarkType) { 2466645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kRTree_BenchmarkType: 2476645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org numRecordings = kNumRTreeRecordings; 2486645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org break; 2496645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org case kNormal_BenchmarkType: 2506645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org numRecordings = kNumNormalRecordings; 2516645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org break; 2526645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 2536645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org do_benchmark_work(&renderer, benchmarkType, path, pic, numRecordings, "recording", timer); 2546645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org} 2556645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 2566645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org/** 2576645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Takes argc,argv along with one of the benchmark functions defined above. 2586645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Will loop along all skp files and perform measurments. 2596645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * 2606645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Returns a SkScalar representing CPU time taken during benchmark. 2616645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * As a side effect, it spits the timer result to stdout. 2626645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org * Will return -1.0 on error. 2636645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org */ 2646645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgstatic bool benchmark_loop( 2656645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org int argc, 2666645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org char **argv, 2676645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org const BenchmarkControl& benchControl, 268fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com Histogram** histogram) { 2696645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 2706645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org static const SkString timeFormat("%f"); 2716645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org TimerData timerData(timeFormat, timeFormat); 2726645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org for (int index = 1; index < argc; ++index) { 2736645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org BenchTimer timer; 2746645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString path(argv[index]); 2756645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkAutoTUnref<SkPicture> pic(pic_from_path(path.c_str())); 2766645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (NULL == pic) { 2776645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkDebugf("Couldn't create picture. Ignoring path: %s\n", path.c_str()); 2786645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org continue; 2796645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 2806645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org benchControl.fFunction(benchControl.fType, benchControl.fTileSize, path, pic, &timer); 2816645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org timerData.appendTimes(&timer, argc - 1 == index); 2826645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 283fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com histogram[index - 1]->fPath = path; 284fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com histogram[index - 1]->fCpuTime = SkDoubleToScalar(timer.fCpu); 2856645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 2866645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 2876645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org const SkString timerResult = timerData.getResult( 2886645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /*logPerIter = */ false, 2896645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /*printMin = */ false, 2906645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /*repeatDraw = */ 1, 2916645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /*configName = */ benchControl.fName.c_str(), 2926645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /*showWallTime = */ false, 2936645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /*showTruncatedWallTime = */ false, 2946645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /*showCpuTime = */ true, 2956645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /*showTruncatedCpuTime = */ false, 2966645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org /*showGpuTime = */ false); 2976645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 2986645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org const char findStr[] = "= "; 2996645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org int pos = timerResult.find(findStr); 3006645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (-1 == pos) { 3016645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkDebugf("Unexpected output from TimerData::getResult(...). Unable to parse."); 3026645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return false; 3036645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3046645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 3056645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkScalar cpuTime = SkDoubleToScalar(atof(timerResult.c_str() + pos + sizeof(findStr) - 1)); 3066645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (cpuTime == 0) { // atof returns 0.0 on error. 3076645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkDebugf("Unable to read value from timer result.\n"); 3086645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return false; 3096645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3106645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return true; 3116645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org} 3126645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 3131d38ae9162d9702a8999e1fe872ead3e0a3f1181sglez@google.comint tool_main(int argc, char** argv); 3141d38ae9162d9702a8999e1fe872ead3e0a3f1181sglez@google.comint tool_main(int argc, char** argv) { 3156645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkAutoGraphics ag; 3166645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString usage; 3176645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org usage.printf("Usage: filename [filename]*\n"); 3186645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 3196645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (argc < 2) { 3206645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkDebugf("%s\n", usage.c_str()); 3216645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return -1; 3226645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3236645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 324fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com Histogram* histograms[kNumBenchmarks]; 3256645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 3266645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org for (size_t i = 0; i < kNumBenchmarks; ++i) { 327fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com histograms[i] = SkNEW_ARRAY(Histogram, argc - 1); 3286645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org bool success = benchmark_loop( 3296645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org argc, argv, 3306645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org BenchmarkControl::Make(i), 331fc9eb1b80b0557648a452caff3afd4d1d88f5ca7sglez@google.com &histograms[i]); 3326645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (!success) { 3336645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkDebugf("benchmark_loop failed at index %d", i); 3346645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3356645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3366645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 3376645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // Output gnuplot readable histogram data.. 3386645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org const char* pbTitle = "bbh_shootout_playback.dat"; 3396645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org const char* recTitle = "bbh_shootout_record.dat"; 3406645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkFILEWStream playbackOut(pbTitle); 3416645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkFILEWStream recordOut(recTitle); 3426645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org recordOut.writeText("# "); 3436645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org playbackOut.writeText("# "); 3446645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org for (size_t i = 0; i < kNumBenchmarks; ++i) { 3456645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString out; 3466645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org out.printf("%s ", BenchmarkControl::getBenchmarkName(i).c_str()); 3476645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (BenchmarkControl::getBenchmarkFunc(i) == &benchmark_recording) { 3486645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org recordOut.writeText(out.c_str()); 3496645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3506645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org if (BenchmarkControl::getBenchmarkFunc(i) == &benchmark_playback) { 3516645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org playbackOut.writeText(out.c_str()); 3526645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3536645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3546645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org recordOut.writeText("\n"); 3556645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org playbackOut.writeText("\n"); 3566645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 3576645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org for (int i = 0; i < argc - 1; ++i) { 3586645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString pbLine; 3596645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkString recLine; 3606645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // ==== Write record info 3616645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org recLine.printf("%d ", i); 3626645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org recLine.appendf("%f ", histograms[0][i].fCpuTime); // Append normal_record time 3636645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org recLine.appendf("%f", histograms[1][i].fCpuTime); // Append rtree_record time 3646645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 3656645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // ==== Write playback info 3666645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org pbLine.printf("%d ", i); 3676645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org pbLine.appendf("%f ", histograms[2][i].fCpuTime); // Start with normal playback time. 3686645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org // Append all playback benchmark times. 3696645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org for (size_t j = kNumBbhPlaybackBenchmarks; j < kNumBenchmarks; ++j) { 3706645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org pbLine.appendf("%f ", histograms[j][i].fCpuTime); 3716645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3726645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org pbLine.remove(pbLine.size() - 1, 1); // Remove trailing space from line. 3736645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org pbLine.appendf("\n"); 3746645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org recLine.appendf("\n"); 3756645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org playbackOut.writeText(pbLine.c_str()); 3766645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org recordOut.writeText(recLine.c_str()); 3776645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org } 3786645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org SkDebugf("\nWrote data to gnuplot-readable files: %s %s\n", pbTitle, recTitle); 3796645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 3806645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return 0; 3816645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org} 3826645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 3836645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.orgint main(int argc, char** argv) { 3846645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org return tool_main(argc, argv); 3856645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org} 3866645cde43d7dbf0df76dbda2c089d8f58560e3e2commit-bot@chromium.org 387