1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ciclass CanvasSaveRestoreBench : public Benchmark { 12cb93a386Sopenharmony_cipublic: 13cb93a386Sopenharmony_ci CanvasSaveRestoreBench(int depth) : fDepth(depth) { 14cb93a386Sopenharmony_ci fName.printf("canvas_save_restore_%d", fDepth); 15cb93a386Sopenharmony_ci } 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciprotected: 18cb93a386Sopenharmony_ci const char* onGetName() override { return fName.c_str(); } 19cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { return backend == kRaster_Backend; } 20cb93a386Sopenharmony_ci SkIPoint onGetSize() override { return { 1, 1 }; } 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 23cb93a386Sopenharmony_ci SkM44 m = SkM44::Rotate({0, 0, 1}, 1); 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci for (int i = 0; i < loops; ++i) { 26cb93a386Sopenharmony_ci for (int j = 0; j < fDepth; ++j) { 27cb93a386Sopenharmony_ci canvas->save(); 28cb93a386Sopenharmony_ci canvas->concat(m); 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci canvas->drawColor(SkColors::kCyan); 31cb93a386Sopenharmony_ci for (int j = 0; j < fDepth; ++j) { 32cb93a386Sopenharmony_ci canvas->restore(); 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci } 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ciprivate: 38cb93a386Sopenharmony_ci const int fDepth; 39cb93a386Sopenharmony_ci SkString fName; 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci using INHERITED = Benchmark; 42cb93a386Sopenharmony_ci}; 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci// Performance remains roughly constant up to 32 (the number of preallocated save records). 45cb93a386Sopenharmony_ci// After that, the cost of additional malloc/free calls starts to be measurable. 46cb93a386Sopenharmony_ciDEF_BENCH( return new CanvasSaveRestoreBench(8);) 47cb93a386Sopenharmony_ciDEF_BENCH( return new CanvasSaveRestoreBench(32);) 48cb93a386Sopenharmony_ciDEF_BENCH( return new CanvasSaveRestoreBench(128);) 49cb93a386Sopenharmony_ciDEF_BENCH( return new CanvasSaveRestoreBench(512);) 50