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