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/base/SkTemplates.h"
10 #include "src/core/SkMemset.h"
11
12 using namespace skia_private;
13
14 template <typename T>
15 class MemsetBench : public Benchmark {
16 public:
MemsetBench(size_t bytes)17 explicit MemsetBench(size_t bytes)
18 : fN(bytes / sizeof(T))
19 , fBuffer(fN)
20 , fName(SkStringPrintf("memset%zu_%zu", sizeof(T)*8, bytes)) {}
21
isSuitableFor(Backend backend)22 bool isSuitableFor(Backend backend) override { return backend == Backend::kNonRendering; }
onGetName()23 const char* onGetName() override { return fName.c_str(); }
24
25 void onDraw(int loops, SkCanvas*) override;
26
27 private:
28 int fN;
29 AutoTMalloc<T> fBuffer;
30 SkString fName;
31 };
32
onDraw(int loops,SkCanvas *)33 template <> void MemsetBench<uint64_t>::onDraw(int loops, SkCanvas*) {
34 for (int i = 0; i < 1000*loops; i++) {
35 SkOpts::memset64(fBuffer.get(), 0xFACEFACEFACEFACE, fN);
36 }
37 }
38
onDraw(int loops,SkCanvas *)39 template <> void MemsetBench<uint32_t>::onDraw(int loops, SkCanvas*) {
40 for (int i = 0; i < 1000*loops; i++) {
41 SkOpts::memset32(fBuffer.get(), 0xFACEB004, fN);
42 }
43 }
44
onDraw(int loops,SkCanvas *)45 template <> void MemsetBench<uint16_t>::onDraw(int loops, SkCanvas*) {
46 for (int i = 0; i < 1000*loops; i++) {
47 SkOpts::memset16(fBuffer.get(), 0x4973, fN);
48 }
49 }
50
51 DEF_BENCH(return (new MemsetBench<uint64_t>(16)));
52 DEF_BENCH(return (new MemsetBench<uint64_t>(64)));
53 DEF_BENCH(return (new MemsetBench<uint64_t>(256)));
54 DEF_BENCH(return (new MemsetBench<uint64_t>(512)));
55 DEF_BENCH(return (new MemsetBench<uint64_t>(768)));
56 DEF_BENCH(return (new MemsetBench<uint64_t>(1024)));
57 DEF_BENCH(return (new MemsetBench<uint64_t>(2048)));
58 DEF_BENCH(return (new MemsetBench<uint64_t>(4096)));
59 DEF_BENCH(return (new MemsetBench<uint64_t>(65536)));
60
61 DEF_BENCH(return (new MemsetBench<uint32_t>(16)));
62 DEF_BENCH(return (new MemsetBench<uint32_t>(64)));
63 DEF_BENCH(return (new MemsetBench<uint32_t>(256)));
64 DEF_BENCH(return (new MemsetBench<uint32_t>(512)));
65 DEF_BENCH(return (new MemsetBench<uint32_t>(768)));
66 DEF_BENCH(return (new MemsetBench<uint32_t>(1024)));
67 DEF_BENCH(return (new MemsetBench<uint32_t>(2048)));
68 DEF_BENCH(return (new MemsetBench<uint32_t>(4096)));
69 DEF_BENCH(return (new MemsetBench<uint32_t>(65536)));
70
71 DEF_BENCH(return (new MemsetBench<uint16_t>(16)));
72 DEF_BENCH(return (new MemsetBench<uint16_t>(64)));
73 DEF_BENCH(return (new MemsetBench<uint16_t>(256)));
74 DEF_BENCH(return (new MemsetBench<uint16_t>(512)));
75 DEF_BENCH(return (new MemsetBench<uint16_t>(768)));
76 DEF_BENCH(return (new MemsetBench<uint16_t>(1024)));
77 DEF_BENCH(return (new MemsetBench<uint16_t>(2048)));
78 DEF_BENCH(return (new MemsetBench<uint16_t>(4096)));
79 DEF_BENCH(return (new MemsetBench<uint16_t>(65536)));
80