Home | History | Annotate | Download | only in bench
      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