1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkBenchmark.h" 9 #include "SkCanvas.h" 10 #include "SkUtils.h" 11 #include "SkString.h" 12 13 class MemsetBench : public SkBenchmark { 14 SkString fName; 15 16 protected: 17 size_t fMinSize; 18 size_t fMaxSize; 19 enum { 20 kBufferSize = 10000, 21 VALUE32 = 0x12345678, 22 VALUE16 = 0x1234 23 }; 24 25 enum MemsetType { 26 MEMSET16 = 16, 27 MEMSET32 = 32 28 }; 29 30 public: MemsetBench(MemsetType type,size_t minSize,size_t maxSize)31 MemsetBench(MemsetType type, size_t minSize, size_t maxSize) { 32 SkASSERT((minSize < maxSize) && (maxSize <= kBufferSize)); 33 fMinSize = minSize; 34 fMaxSize = maxSize; 35 fName.printf("memset%d_" SK_SIZE_T_SPECIFIER "_" SK_SIZE_T_SPECIFIER, 36 type, minSize, maxSize); 37 } 38 isSuitableFor(Backend backend)39 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 40 return backend == kNonRendering_Backend; 41 } 42 43 virtual void performTest() = 0; 44 45 protected: onGetName()46 virtual const char* onGetName() SK_OVERRIDE { 47 return fName.c_str(); 48 } 49 onDraw(const int loops,SkCanvas * canvas)50 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 51 for (int i = 0; i < loops; ++i) { 52 this->performTest(); 53 } 54 } 55 56 private: 57 typedef SkBenchmark INHERITED; 58 }; 59 60 class Memset32Bench : public MemsetBench { 61 uint32_t kBuffer[kBufferSize + 3]; 62 public: Memset32Bench(size_t minSize,size_t maxSize)63 Memset32Bench(size_t minSize, size_t maxSize) 64 : INHERITED(MEMSET32, minSize, maxSize) {} 65 66 protected: performTest()67 virtual void performTest() SK_OVERRIDE { 68 for(size_t j = fMinSize; j < fMaxSize; ++j){ 69 sk_memset32(kBuffer, VALUE32, j); 70 sk_memset32(kBuffer + 1, VALUE32, j); 71 sk_memset32(kBuffer + 2, VALUE32, j); 72 sk_memset32(kBuffer + 3, VALUE32, j); 73 } 74 } 75 private: 76 typedef MemsetBench INHERITED; 77 }; 78 79 class Memset16Bench : public MemsetBench { 80 uint16_t kBuffer[kBufferSize + 7]; 81 public: Memset16Bench(size_t minSize,size_t maxSize)82 Memset16Bench(size_t minSize, size_t maxSize) 83 : INHERITED(MEMSET16, minSize, maxSize) {} 84 85 protected: performTest()86 virtual void performTest() SK_OVERRIDE { 87 for(size_t j = fMinSize; j < fMaxSize; ++j){ 88 sk_memset16(kBuffer, VALUE16, j); 89 sk_memset16(kBuffer + 1, VALUE16, j); 90 sk_memset16(kBuffer + 2, VALUE16, j); 91 sk_memset16(kBuffer + 3, VALUE16, j); 92 sk_memset16(kBuffer + 4, VALUE16, j); 93 sk_memset16(kBuffer + 5, VALUE16, j); 94 sk_memset16(kBuffer + 6, VALUE16, j); 95 sk_memset16(kBuffer + 7, VALUE16, j); 96 } 97 } 98 private: 99 typedef MemsetBench INHERITED; 100 }; 101 102 DEF_BENCH(return new Memset32Bench(1, 600);) 103 DEF_BENCH(return new Memset32Bench(600, 800);) 104 DEF_BENCH(return new Memset32Bench(800, 1000);) 105 DEF_BENCH(return new Memset32Bench(1000, 2000);) 106 DEF_BENCH(return new Memset32Bench(2000, 3000);) 107 DEF_BENCH(return new Memset32Bench(3000, 4000);) 108 DEF_BENCH(return new Memset32Bench(4000, 5000);) 109 110 DEF_BENCH(return new Memset16Bench(1, 600);) 111 DEF_BENCH(return new Memset16Bench(600, 800);) 112 DEF_BENCH(return new Memset16Bench(800, 1000);) 113 DEF_BENCH(return new Memset16Bench(1000, 2000);) 114 DEF_BENCH(return new Memset16Bench(2000, 3000);) 115 DEF_BENCH(return new Memset16Bench(3000, 4000);) 116 DEF_BENCH(return new Memset16Bench(4000, 5000);) 117