monobench.cpp revision 7e602c2c6cb2fbeb70a3978e2148844b673a8a4c
17e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein/* 27e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein * Copyright 2016 Google Inc. 37e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein * 47e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein * Use of this source code is governed by a BSD-style license that can be 57e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein * found in the LICENSE file. 67e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein */ 77e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 87e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein#include "Benchmark.h" 97e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein#include "SkGraphics.h" 107e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein#include <algorithm> 117e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein#include <chrono> 127e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein#include <regex> 137e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein#include <stdio.h> 147e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein#include <string> 157e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein#include <vector> 167e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 177e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtkleinint main(int argc, char** argv) { 187e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein SkGraphics::Init(); 197e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 207e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein using clock = std::chrono::high_resolution_clock; 217e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein using ns = std::chrono::duration<double, std::nano>; 227e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 237e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein std::regex pattern; 247e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein if (argc > 1) { 257e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein pattern = argv[1]; 267e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 277e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 287e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein struct Bench { 297e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein std::unique_ptr<Benchmark> b; 307e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein std::string name; 317e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein ns best; 327e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein }; 337e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein std::vector<Bench> benches; 347e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 357e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein for (auto r = BenchRegistry::Head(); r; r = r->next()) { 367e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein std::unique_ptr<Benchmark> bench{ r->factory()(nullptr) }; 377e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 387e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein std::string name = bench->getName(); 397e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein if (std::regex_search(name, pattern) && 407e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein bench->isSuitableFor(Benchmark::kNonRendering_Backend)) { 417e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein bench->delayedSetup(); 427e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein benches.emplace_back(Bench{std::move(bench), name, ns{1.0/0.0}}); 437e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 447e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 457e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 467e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein if (benches.size() > 1) { 477e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein int common_prefix = benches[0].name.size(); 487e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein for (size_t i = 1; i < benches.size(); i++) { 497e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein int len = std::mismatch(benches[i-1].name.begin(), benches[i-1].name.end(), 507e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein benches[i-0].name.begin()) 517e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein .first - benches[i-1].name.begin(); 527e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein common_prefix = std::min(common_prefix, len); 537e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 547e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein std::string prefix = benches[0].name.substr(0, common_prefix); 557e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein if (common_prefix) { 567e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein for (auto& bench : benches) { 577e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein bench.name.replace(0, common_prefix, "…"); 587e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 597e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 607e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 617e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein int common_suffix = benches[0].name.size(); 627e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein for (size_t i = 1; i < benches.size(); i++) { 637e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein int len = std::mismatch(benches[i-1].name.rbegin(), benches[i-1].name.rend(), 647e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein benches[i-0].name.rbegin()) 657e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein .first - benches[i-1].name.rbegin(); 667e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein common_suffix = std::min(common_suffix, len); 677e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 687e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein std::string suffix = benches[0].name.substr(benches[0].name.size() - common_suffix); 697e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein if (common_suffix) { 707e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein for (auto& bench : benches) { 717e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein bench.name.replace(bench.name.size() - common_suffix, common_suffix, "…"); 727e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 737e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 747e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 757e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein printf("%s…%s\n", prefix.c_str(), suffix.c_str()); 767e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 777e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 787e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein int samples = 0; 797e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein for (;;) { 807e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein for (auto& bench : benches) { 817e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein for (int loops = 1; loops < 1000000000;) { 827e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein bench.b->preDraw(nullptr); 837e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein auto start = clock::now(); 847e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein bench.b->draw(loops, nullptr); 857e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein ns elapsed = clock::now() - start; 867e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein bench.b->postDraw(nullptr); 877e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 887e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein if (elapsed < std::chrono::milliseconds{10}) { 897e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein loops *= 2; 907e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein continue; 917e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 927e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 937e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein bench.best = std::min(bench.best, elapsed / loops); 947e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein samples++; 957e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 967e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein std::sort(benches.begin(), benches.end(), [](const Bench& a, const Bench& b) { 977e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein return a.best < b.best; 987e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein }); 997e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein printf("\r\033[K%d", samples); 1007e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein for (auto& bench : benches) { 1017e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein if (benches.size() == 1) { 1027e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein printf(" %s %gns" , bench.name.c_str(), bench.best.count()); 1037e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } else { 1047e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein printf(" %s %.3gx", bench.name.c_str(), bench.best / benches[0].best); 1057e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 1067e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 1077e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein fflush(stdout); 1087e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein break; 1097e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 1107e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 1117e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein } 1127e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein 1137e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein return 0; 1147e602c2c6cb2fbeb70a3978e2148844b673a8a4cmtklein} 115