• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "SkSHA1.h"
13 #include "SkTemplates.h"
14 
15 enum ChecksumType {
16     kChecksum_ChecksumType,
17     kMD5_ChecksumType,
18     kSHA1_ChecksumType,
19     kMurmur3_ChecksumType,
20 };
21 
22 class ComputeChecksumBench : public Benchmark {
23     enum {
24         U32COUNT  = 256,
25         SIZE      = U32COUNT * 4,
26     };
27     uint32_t    fData[U32COUNT];
28     ChecksumType fType;
29 
30 public:
ComputeChecksumBench(ChecksumType type)31     ComputeChecksumBench(ChecksumType type) : fType(type) {
32         SkRandom rand;
33         for (int i = 0; i < U32COUNT; ++i) {
34             fData[i] = rand.nextU();
35         }
36     }
37 
isSuitableFor(Backend backend)38     virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
39         return backend == kNonRendering_Backend;
40     }
41 
42 protected:
onGetName()43     virtual const char* onGetName() {
44         switch (fType) {
45             case kChecksum_ChecksumType: return "compute_checksum";
46             case kMD5_ChecksumType: return "compute_md5";
47             case kSHA1_ChecksumType: return "compute_sha1";
48             case kMurmur3_ChecksumType: return "compute_murmur3";
49 
50             default: SK_CRASH(); return "";
51         }
52     }
53 
onDraw(const int loops,SkCanvas *)54     virtual void onDraw(const int loops, SkCanvas*) {
55         switch (fType) {
56             case kChecksum_ChecksumType: {
57                 for (int i = 0; i < loops; i++) {
58                     volatile uint32_t result = SkChecksum::Compute(fData, sizeof(fData));
59                     sk_ignore_unused_variable(result);
60                 }
61             } break;
62             case kMD5_ChecksumType: {
63                 for (int i = 0; i < loops; i++) {
64                     SkMD5 md5;
65                     md5.update(reinterpret_cast<uint8_t*>(fData), sizeof(fData));
66                     SkMD5::Digest digest;
67                     md5.finish(digest);
68                 }
69             } break;
70             case kSHA1_ChecksumType: {
71                 for (int i = 0; i < loops; i++) {
72                     SkSHA1 sha1;
73                     sha1.update(reinterpret_cast<uint8_t*>(fData), sizeof(fData));
74                     SkSHA1::Digest digest;
75                     sha1.finish(digest);
76                 }
77             } break;
78             case kMurmur3_ChecksumType: {
79                 for (int i = 0; i < loops; i++) {
80                     volatile uint32_t result = SkChecksum::Murmur3(fData, sizeof(fData));
81                     sk_ignore_unused_variable(result);
82                 }
83             }break;
84         }
85 
86     }
87 
88 private:
89     typedef Benchmark INHERITED;
90 };
91 
92 ///////////////////////////////////////////////////////////////////////////////
93 
94 DEF_BENCH( return new ComputeChecksumBench(kChecksum_ChecksumType); )
95 DEF_BENCH( return new ComputeChecksumBench(kMD5_ChecksumType); )
96 DEF_BENCH( return new ComputeChecksumBench(kSHA1_ChecksumType); )
97 DEF_BENCH( return new ComputeChecksumBench(kMurmur3_ChecksumType); )
98