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 "Benchmark.h" 9#include "SkTemplates.h" 10#include "SkUtils.h" 11 12template <typename T, bool kInline> 13class MemsetBench : public Benchmark { 14public: 15 explicit MemsetBench(int n) 16 : fN(n) 17 , fBuffer(n) 18 , fName(SkStringPrintf("memset%d_%d%s", sizeof(T)*8, n, kInline ? "_inline" : "")) {} 19 20 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } 21 const char* onGetName() override { return fName.c_str(); } 22 23 void onDraw(int loops, SkCanvas*) override; 24 25private: 26 int fN; 27 SkAutoTMalloc<T> fBuffer; 28 SkString fName; 29}; 30 31template <> void MemsetBench<uint32_t, false>::onDraw(int loops, SkCanvas*) { 32 for (int i = 0; i < 1000*loops; i++) { 33 sk_memset32(fBuffer.get(), 0xFACEB004, fN); 34 } 35} 36 37template <> void MemsetBench<uint16_t, false>::onDraw(int loops, SkCanvas*) { 38 for (int i = 0; i < 1000*loops; i++) { 39 sk_memset16(fBuffer.get(), 0x4973, fN); 40 } 41} 42 43template <typename T> 44static void memsetT(T* dst, T val, int n) { 45 for (int i = 0; i < n; i++) { dst[i] = val; } 46} 47 48template <> void MemsetBench<uint32_t, true>::onDraw(int loops, SkCanvas*) { 49 for (int i = 0; i < 1000*loops; i++) { 50 memsetT<uint32_t>(fBuffer.get(), 0xFACEB004, fN); 51 } 52} 53 54template <> void MemsetBench<uint16_t, true>::onDraw(int loops, SkCanvas*) { 55 for (int i = 0; i < 1000*loops; i++) { 56 memsetT<uint16_t>(fBuffer.get(), 0x4973, fN); 57 } 58} 59 60DEF_BENCH(return (new MemsetBench<uint32_t, true>(1))); 61DEF_BENCH(return (new MemsetBench<uint32_t, false>(1))); 62DEF_BENCH(return (new MemsetBench<uint32_t, true>(10))); 63DEF_BENCH(return (new MemsetBench<uint32_t, false>(10))); 64DEF_BENCH(return (new MemsetBench<uint32_t, true>(100))); 65DEF_BENCH(return (new MemsetBench<uint32_t, false>(100))); 66DEF_BENCH(return (new MemsetBench<uint32_t, true>(1000))); 67DEF_BENCH(return (new MemsetBench<uint32_t, false>(1000))); 68DEF_BENCH(return (new MemsetBench<uint32_t, true>(10000))); 69DEF_BENCH(return (new MemsetBench<uint32_t, false>(10000))); 70DEF_BENCH(return (new MemsetBench<uint32_t, true>(100000))); 71DEF_BENCH(return (new MemsetBench<uint32_t, false>(100000))); 72 73DEF_BENCH(return (new MemsetBench<uint16_t, true>(1))); 74DEF_BENCH(return (new MemsetBench<uint16_t, false>(1))); 75DEF_BENCH(return (new MemsetBench<uint16_t, true>(10))); 76DEF_BENCH(return (new MemsetBench<uint16_t, false>(10))); 77DEF_BENCH(return (new MemsetBench<uint16_t, true>(100))); 78DEF_BENCH(return (new MemsetBench<uint16_t, false>(100))); 79DEF_BENCH(return (new MemsetBench<uint16_t, true>(1000))); 80DEF_BENCH(return (new MemsetBench<uint16_t, false>(1000))); 81DEF_BENCH(return (new MemsetBench<uint16_t, true>(10000))); 82DEF_BENCH(return (new MemsetBench<uint16_t, false>(10000))); 83DEF_BENCH(return (new MemsetBench<uint16_t, true>(100000))); 84DEF_BENCH(return (new MemsetBench<uint16_t, false>(100000))); 85