ChecksumBench.cpp revision fc8581b2d8c63439162c701623bce096088ce6e6
1/* 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" 10#include "SkString.h" 11 12class ComputeChecksumBench : public SkBenchmark { 13public: 14 ComputeChecksumBench(void* param, const char name[]) : INHERITED(param) { 15 fName.printf("compute_checksum_%s", name); 16 } 17 18 enum { 19 DATA_SIZE = 1024, 20 N = SkBENCHLOOP(100000), 21 }; 22protected: 23 virtual const char* onGetName() { 24 return fName.c_str(); 25 } 26 27 virtual void onDraw(SkCanvas* canvas) { 28 uint64_t data[DATA_SIZE / sizeof(uint64_t)]; 29 computeChecksum(data, DATA_SIZE); 30 } 31 32 virtual void computeChecksum(const uint64_t*, size_t) = 0; 33 34 SkString fName; 35private: 36 typedef SkBenchmark INHERITED; 37}; 38 39/* 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 95/////////////////////////////////////////////////////////////////////////////// 96 97static 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); } 100 101static BenchRegistry gReg0(Fact0); 102static BenchRegistry gReg1(Fact1); 103static BenchRegistry gReg2(Fact2); 104