blob: 903e584c55ee4eb8026a0c6b3509e83dd364eb73 [file] [log] [blame]
junov@chromium.orgef760602012-06-27 20:03:16 +00001/*
2 * Copyright 2012 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#include "SkBenchmark.h"
8#include "SkCanvas.h"
9#include "SkChecksum.h"
reed@google.comfc8581b2012-07-09 17:40:48 +000010#include "SkString.h"
junov@chromium.orgef760602012-06-27 20:03:16 +000011
12class ComputeChecksumBench : public SkBenchmark {
reed@google.comf8affe52012-07-09 17:05:51 +000013public:
reed@google.comfc8581b2012-07-09 17:40:48 +000014 ComputeChecksumBench(void* param, const char name[]) : INHERITED(param) {
15 fName.printf("compute_checksum_%s", name);
reed@google.comf8affe52012-07-09 17:05:51 +000016 }
17
reed@google.comfc8581b2012-07-09 17:40:48 +000018 enum {
19 DATA_SIZE = 1024,
20 N = SkBENCHLOOP(100000),
21 };
junov@chromium.orgef760602012-06-27 20:03:16 +000022protected:
23 virtual const char* onGetName() {
reed@google.comfc8581b2012-07-09 17:40:48 +000024 return fName.c_str();
junov@chromium.orgef760602012-06-27 20:03:16 +000025 }
26
27 virtual void onDraw(SkCanvas* canvas) {
reed@google.comfc8581b2012-07-09 17:40:48 +000028 uint64_t data[DATA_SIZE / sizeof(uint64_t)];
29 computeChecksum(data, DATA_SIZE);
junov@chromium.orgef760602012-06-27 20:03:16 +000030 }
31
reed@google.comfc8581b2012-07-09 17:40:48 +000032 virtual void computeChecksum(const uint64_t*, size_t) = 0;
33
34 SkString fName;
junov@chromium.orgef760602012-06-27 20:03:16 +000035private:
36 typedef SkBenchmark INHERITED;
37};
38
reed@google.comfc8581b2012-07-09 17:40:48 +000039/*
40 * Use SkComputeChecksum32 to compute a checksum on a datablock
41 */
42class ComputeChecksum32Bench : public ComputeChecksumBench {
43public:
44 ComputeChecksum32Bench(void* param)
45 : INHERITED(param, "32") { }
46
47protected:
48 virtual void computeChecksum(const uint64_t* data, size_t len) {
49 for (int i = 0; i < N; i++) {
50 volatile uint32_t result = SkComputeChecksum32(reinterpret_cast<const uint32_t*>(data), len);
51 }
52 }
53
54private:
55 typedef ComputeChecksumBench INHERITED;
56};
57
58/*
59 * Use SkComputeChecksum64 to compute a checksum on a datablock
60 */
61class ComputeChecksum64Bench : public ComputeChecksumBench {
62public:
63 ComputeChecksum64Bench(void* param)
64 : INHERITED(param, "64") { }
65
66protected:
67 virtual void computeChecksum(const uint64_t* data, size_t len) {
68 for (int i = 0; i < N; i++) {
69 volatile uint64_t result = SkComputeChecksum64(data, len);
70 }
71 }
72
73private:
74 typedef ComputeChecksumBench INHERITED;
75};
76
77/*
78 * Use SkComputeChecksum64 to compute a checksum on a datablock
79 */
80class ComputeChecksumXXBench : public ComputeChecksumBench {
81public:
82 ComputeChecksumXXBench(void* param) : INHERITED(param, "XX") { }
83
84protected:
85 virtual void computeChecksum(const uint64_t* data, size_t len) {
86 for (int i = 0; i < N; i++) {
87 volatile uint32_t result = SkChecksum::Compute(reinterpret_cast<const uint32_t*>(data), len);
88 }
89 }
90
91private:
92 typedef ComputeChecksumBench INHERITED;
93};
94
junov@chromium.orgef760602012-06-27 20:03:16 +000095///////////////////////////////////////////////////////////////////////////////
96
reed@google.comfc8581b2012-07-09 17:40:48 +000097static SkBenchmark* Fact0(void* p) { return new ComputeChecksum32Bench(p); }
98static SkBenchmark* Fact1(void* p) { return new ComputeChecksum64Bench(p); }
99static SkBenchmark* Fact2(void* p) { return new ComputeChecksumXXBench(p); }
junov@chromium.orgef760602012-06-27 20:03:16 +0000100
101static BenchRegistry gReg0(Fact0);
reed@google.comfc8581b2012-07-09 17:40:48 +0000102static BenchRegistry gReg1(Fact1);
103static BenchRegistry gReg2(Fact2);