C++程序  |  178行  |  5.66 KB

/*
 * 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 <algorithm>

#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);)