| Index: bench/MemsetBench.cpp
|
| diff --git a/bench/MemsetBench.cpp b/bench/MemsetBench.cpp
|
| index e0390bba38d21ac835a9e6befe659ff7bfde9615..d1682bdd70c459b2219a81b161b69faed27cb347 100644
|
| --- a/bench/MemsetBench.cpp
|
| +++ b/bench/MemsetBench.cpp
|
| @@ -6,110 +6,79 @@
|
| */
|
|
|
| #include "Benchmark.h"
|
| -#include "SkCanvas.h"
|
| -#include "SkString.h"
|
| +#include "SkTemplates.h"
|
| #include "SkUtils.h"
|
|
|
| +template <typename T, bool kInline>
|
| 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);
|
| - }
|
| + explicit MemsetBench(int n)
|
| + : fN(n)
|
| + , fBuffer(n)
|
| + , fName(SkStringPrintf("memset%d_%d%s", sizeof(T)*8, n, kInline ? "_inline" : "")) {}
|
|
|
| - bool isSuitableFor(Backend backend) override {
|
| - return backend == kNonRendering_Backend;
|
| - }
|
| + bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
|
| + const char* onGetName() override { return fName.c_str(); }
|
|
|
| - 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();
|
| - }
|
| - }
|
| + void onDraw(const int loops, SkCanvas*) override;
|
|
|
| private:
|
| - typedef Benchmark INHERITED;
|
| + int fN;
|
| + SkAutoTMalloc<T> fBuffer;
|
| + SkString fName;
|
| };
|
|
|
| -class Memset32Bench : public MemsetBench {
|
| - uint32_t kBuffer[kBufferSize + 3];
|
| -public:
|
| - Memset32Bench(int minSize, int maxSize)
|
| - : INHERITED(MEMSET32, minSize, maxSize) {}
|
| +template <> void MemsetBench<uint32_t, false>::onDraw(const int loops, SkCanvas*) {
|
| + for (int i = 0; i < 1000*loops; i++) {
|
| + sk_memset32(fBuffer.get(), 0xFACEB004, fN);
|
| + }
|
| +}
|
|
|
| -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);
|
| - }
|
| +template <> void MemsetBench<uint16_t, false>::onDraw(const int loops, SkCanvas*) {
|
| + for (int i = 0; i < 1000*loops; i++) {
|
| + sk_memset16(fBuffer.get(), 0x4973, fN);
|
| }
|
| -private:
|
| - typedef MemsetBench INHERITED;
|
| -};
|
| +}
|
|
|
| -class Memset16Bench : public MemsetBench {
|
| - uint16_t kBuffer[kBufferSize + 7];
|
| -public:
|
| - Memset16Bench(int minSize, int maxSize)
|
| - : INHERITED(MEMSET16, minSize, maxSize) {}
|
| +template <typename T>
|
| +static void memsetT(T* dst, T val, int n) {
|
| + for (int i = 0; i < n; i++) { dst[i] = val; }
|
| +}
|
|
|
| -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);
|
| - }
|
| +template <> void MemsetBench<uint32_t, true>::onDraw(const int loops, SkCanvas*) {
|
| + for (int i = 0; i < 1000*loops; i++) {
|
| + memsetT<uint32_t>(fBuffer.get(), 0xFACEB004, fN);
|
| }
|
| -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);)
|
| +template <> void MemsetBench<uint16_t, true>::onDraw(const int loops, SkCanvas*) {
|
| + for (int i = 0; i < 1000*loops; i++) {
|
| + memsetT<uint16_t>(fBuffer.get(), 0x4973, fN);
|
| + }
|
| +}
|
| +
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, true>(1)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, false>(1)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, true>(10)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, false>(10)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, true>(100)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, false>(100)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, true>(1000)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, false>(1000)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, true>(10000)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, false>(10000)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, true>(100000)));
|
| +DEF_BENCH(return (new MemsetBench<uint32_t, false>(100000)));
|
| +
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, true>(1)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, false>(1)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, true>(10)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, false>(10)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, true>(100)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, false>(100)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, true>(1000)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, false>(1000)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, true>(10000)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, false>(10000)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, true>(100000)));
|
| +DEF_BENCH(return (new MemsetBench<uint16_t, false>(100000)));
|
|
|