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 "Benchmark.h" 8 #include "SkCanvas.h" 9 #include "SkChecksum.h" 10 #include "SkMD5.h" 11 #include "SkRandom.h" 12 #include "SkTemplates.h" 13 14 enum ChecksumType { 15 kMD5_ChecksumType, 16 kMurmur3_ChecksumType, 17 }; 18 19 class ComputeChecksumBench : public Benchmark { 20 enum { 21 U32COUNT = 256, 22 SIZE = U32COUNT * 4, 23 }; 24 uint32_t fData[U32COUNT]; 25 ChecksumType fType; 26 27 public: 28 ComputeChecksumBench(ChecksumType type) : fType(type) { 29 SkRandom rand; 30 for (int i = 0; i < U32COUNT; ++i) { 31 fData[i] = rand.nextU(); 32 } 33 } 34 35 bool isSuitableFor(Backend backend) override { 36 return backend == kNonRendering_Backend; 37 } 38 39 protected: 40 const char* onGetName() override { 41 switch (fType) { 42 case kMD5_ChecksumType: return "compute_md5"; 43 case kMurmur3_ChecksumType: return "compute_murmur3"; 44 45 default: SK_ABORT("Invalid Type"); return ""; 46 } 47 } 48 49 void onDraw(int loops, SkCanvas*) override { 50 switch (fType) { 51 case kMD5_ChecksumType: { 52 for (int i = 0; i < loops; i++) { 53 SkMD5 md5; 54 md5.update(reinterpret_cast<uint8_t*>(fData), sizeof(fData)); 55 SkMD5::Digest digest; 56 md5.finish(digest); 57 } 58 } break; 59 case kMurmur3_ChecksumType: { 60 for (int i = 0; i < loops; i++) { 61 volatile uint32_t result = SkChecksum::Murmur3(fData, sizeof(fData)); 62 sk_ignore_unused_variable(result); 63 } 64 }break; 65 } 66 67 } 68 69 private: 70 typedef Benchmark INHERITED; 71 }; 72 73 /////////////////////////////////////////////////////////////////////////////// 74 75 DEF_BENCH( return new ComputeChecksumBench(kMD5_ChecksumType); ) 76 DEF_BENCH( return new ComputeChecksumBench(kMurmur3_ChecksumType); ) 77