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