/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ // for std::max #include #include "Benchmark.h" #include "SkCurveMeasure.h" #include "SkPath.h" #include "SkPathMeasure.h" #include "SkString.h" #define NORMALIZE_LOOPS class MeasureBench : public Benchmark { protected: SkString fName; SkPath fPath; bool fUsePathMeasure; float fSize; size_t fPieces; SkPoint fPts[3]; public: MeasureBench(bool usePathMeasure, float size, size_t pieces) : fUsePathMeasure(usePathMeasure), fSize(size), fPieces(pieces) { fName.printf("measure_%s_%.1f_" SK_SIZE_T_SPECIFIER, fUsePathMeasure ? "pathMeasure" : "curveMeasure", fSize, fPieces); auto p1 = SkPoint::Make(0, 0); auto p2 = SkPoint::Make(30*fSize, 0); auto p3 = SkPoint::Make(15*fSize, 15*fSize); fPts[0] = p1; fPts[1] = p2; fPts[2] = p3; this->setPath(); } protected: const char* onGetName() override { return fName.c_str(); } void setPath() { fPath.moveTo(fPts[0]); fPath.quadTo(fPts[1], fPts[2]); } int numLoops() { #ifdef NORMALIZE_LOOPS // arbitrary heuristic return std::max(2, 10000 / ((int)fSize*(int)fPieces)); #else return 1000; #endif // NORMALIZE_LOOPS } //// measurement code void do_pathMeasure(SkCanvas* canvas) { SkPathMeasure meas(fPath, false); SkScalar totalLength = meas.getLength(); SkScalar pieceLength = totalLength / fPieces; SkPoint point; for (size_t i = 0; i <= fPieces; i++) { if (meas.getPosTan(i * pieceLength, &point, nullptr)) { }; } } void do_curveMeasure(SkCanvas* canvas) { SkCurveMeasure meas(fPts, kQuad_SegType); SkScalar totalLength = meas.getLength(); SkScalar pieceLength = totalLength / fPieces; SkPoint point; for (size_t i = 0; i <= fPieces; i++) { meas.getPosTanTime(i*pieceLength, &point, nullptr, nullptr); } } void onDraw(int loops, SkCanvas* canvas) override { int inner_loops = numLoops(); for (int i = 0; i < loops; i++) { for (int j = 0; j < inner_loops; j++) { if (fUsePathMeasure) { do_pathMeasure(canvas); } else { do_curveMeasure(canvas); } } } } private: typedef Benchmark INHERITED; }; /////////////////////////////////////////////////////////////////////////////// DEF_BENCH(return new MeasureBench(true, 1, 2);) DEF_BENCH(return new MeasureBench(true, 2, 2);) DEF_BENCH(return new MeasureBench(true, 10, 2);) DEF_BENCH(return new MeasureBench(true, 100, 2);) DEF_BENCH(return new MeasureBench(true, 1000, 2);) DEF_BENCH(return new MeasureBench(true, 1, 1);) DEF_BENCH(return new MeasureBench(true, 1, 2);) DEF_BENCH(return new MeasureBench(true, 1, 3);) DEF_BENCH(return new MeasureBench(true, 1, 4);) DEF_BENCH(return new MeasureBench(true, 1, 5);) DEF_BENCH(return new MeasureBench(true, 2, 1);) DEF_BENCH(return new MeasureBench(true, 2, 2);) DEF_BENCH(return new MeasureBench(true, 2, 3);) DEF_BENCH(return new MeasureBench(true, 2, 4);) DEF_BENCH(return new MeasureBench(true, 2, 5);) DEF_BENCH(return new MeasureBench(true, 10, 10);) DEF_BENCH(return new MeasureBench(true, 10, 20);) DEF_BENCH(return new MeasureBench(true, 10, 30);) DEF_BENCH(return new MeasureBench(true, 10, 40);) DEF_BENCH(return new MeasureBench(true, 10, 50);) DEF_BENCH(return new MeasureBench(true, 100, 100);) DEF_BENCH(return new MeasureBench(true, 100, 200);) DEF_BENCH(return new MeasureBench(true, 100, 300);) DEF_BENCH(return new MeasureBench(true, 100, 400);) DEF_BENCH(return new MeasureBench(true, 100, 500);) DEF_BENCH(return new MeasureBench(true, 1000, 1000);) DEF_BENCH(return new MeasureBench(true, 1000, 2000);) DEF_BENCH(return new MeasureBench(true, 1000, 3000);) DEF_BENCH(return new MeasureBench(true, 1000, 4000);) DEF_BENCH(return new MeasureBench(true, 1000, 5000);) DEF_BENCH(return new MeasureBench(false, 1, 2);) DEF_BENCH(return new MeasureBench(false, 2, 2);) DEF_BENCH(return new MeasureBench(false, 10, 2);) DEF_BENCH(return new MeasureBench(false, 100, 2);) DEF_BENCH(return new MeasureBench(false, 1000, 2);) DEF_BENCH(return new MeasureBench(false, 1, 1);) DEF_BENCH(return new MeasureBench(false, 1, 2);) DEF_BENCH(return new MeasureBench(false, 1, 3);) DEF_BENCH(return new MeasureBench(false, 1, 4);) DEF_BENCH(return new MeasureBench(false, 1, 5);) DEF_BENCH(return new MeasureBench(false, 2, 1);) DEF_BENCH(return new MeasureBench(false, 2, 2);) DEF_BENCH(return new MeasureBench(false, 2, 3);) DEF_BENCH(return new MeasureBench(false, 2, 4);) DEF_BENCH(return new MeasureBench(false, 2, 5);) DEF_BENCH(return new MeasureBench(false, 10, 10);) DEF_BENCH(return new MeasureBench(false, 10, 20);) DEF_BENCH(return new MeasureBench(false, 10, 30);) DEF_BENCH(return new MeasureBench(false, 10, 40);) DEF_BENCH(return new MeasureBench(false, 10, 50);) DEF_BENCH(return new MeasureBench(false, 100, 100);) DEF_BENCH(return new MeasureBench(false, 100, 200);) DEF_BENCH(return new MeasureBench(false, 100, 300);) DEF_BENCH(return new MeasureBench(false, 100, 400);) DEF_BENCH(return new MeasureBench(false, 100, 500);) DEF_BENCH(return new MeasureBench(false, 1000, 1000);) DEF_BENCH(return new MeasureBench(false, 1000, 2000);) DEF_BENCH(return new MeasureBench(false, 1000, 3000);) DEF_BENCH(return new MeasureBench(false, 1000, 4000);) DEF_BENCH(return new MeasureBench(false, 1000, 5000);)