/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "Benchmark.h" #include "SkCanvas.h" #include "SkString.h" #include "SkUtils.h" class MemsetBench : public Benchmark { SkString fName; protected: int fMinSize; int fMaxSize; enum { kBufferSize = 10000, VALUE32 = 0x12345678, VALUE16 = 0x1234 }; enum MemsetType { MEMSET16 = 16, MEMSET32 = 32 }; public: MemsetBench(MemsetType type, int minSize, int maxSize) { SkASSERT((minSize < maxSize) && (maxSize <= kBufferSize)); fMinSize = minSize; fMaxSize = maxSize; fName.printf("memset%d_%d_%d", type, minSize, maxSize); } bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } virtual void performTest() = 0; protected: const char* onGetName() override { return fName.c_str(); } void onDraw(const int loops, SkCanvas* canvas) override { for (int i = 0; i < loops; ++i) { this->performTest(); } } private: typedef Benchmark INHERITED; }; class Memset32Bench : public MemsetBench { uint32_t kBuffer[kBufferSize + 3]; public: Memset32Bench(int minSize, int maxSize) : INHERITED(MEMSET32, minSize, maxSize) {} protected: void performTest() override { for(int j = fMinSize; j < fMaxSize; ++j){ sk_memset32(kBuffer, VALUE32, j); sk_memset32(kBuffer + 1, VALUE32, j); sk_memset32(kBuffer + 2, VALUE32, j); sk_memset32(kBuffer + 3, VALUE32, j); } } private: typedef MemsetBench INHERITED; }; class Memset16Bench : public MemsetBench { uint16_t kBuffer[kBufferSize + 7]; public: Memset16Bench(int minSize, int maxSize) : INHERITED(MEMSET16, minSize, maxSize) {} protected: void performTest() override { for(int j = fMinSize; j < fMaxSize; ++j){ sk_memset16(kBuffer, VALUE16, j); sk_memset16(kBuffer + 1, VALUE16, j); sk_memset16(kBuffer + 2, VALUE16, j); sk_memset16(kBuffer + 3, VALUE16, j); sk_memset16(kBuffer + 4, VALUE16, j); sk_memset16(kBuffer + 5, VALUE16, j); sk_memset16(kBuffer + 6, VALUE16, j); sk_memset16(kBuffer + 7, VALUE16, j); } } private: typedef MemsetBench INHERITED; }; DEF_BENCH(return new Memset32Bench(1, 600);) DEF_BENCH(return new Memset32Bench(600, 800);) DEF_BENCH(return new Memset32Bench(800, 1000);) DEF_BENCH(return new Memset32Bench(1000, 2000);) DEF_BENCH(return new Memset32Bench(2000, 3000);) DEF_BENCH(return new Memset32Bench(3000, 4000);) DEF_BENCH(return new Memset32Bench(4000, 5000);) DEF_BENCH(return new Memset16Bench(1, 600);) DEF_BENCH(return new Memset16Bench(600, 800);) DEF_BENCH(return new Memset16Bench(800, 1000);) DEF_BENCH(return new Memset16Bench(1000, 2000);) DEF_BENCH(return new Memset16Bench(2000, 3000);) DEF_BENCH(return new Memset16Bench(3000, 4000);) DEF_BENCH(return new Memset16Bench(4000, 5000);)