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