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