1ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org/*
2ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org * Copyright 2012 Google Inc.
3ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org *
4ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org * Use of this source code is governed by a BSD-style license that can be
5ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org * found in the LICENSE file.
6ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org */
7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
8ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org#include "SkCanvas.h"
9ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org#include "SkChecksum.h"
10cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com#include "SkMD5.h"
11142e1fe7cf5dc82e5d4c107b06756302f0cbf96dreed@google.com#include "SkRandom.h"
12cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com#include "SkSHA1.h"
137de18e5c7b4e4a8ad8910b1016688ded902f185bbungeman@google.com#include "SkTemplates.h"
1429dea74ca6ad6044dc9a90f8ca55092b34945ce4bungeman@google.com
15cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.comenum ChecksumType {
16cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com    kChecksum_ChecksumType,
17cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com    kMD5_ChecksumType,
1870d75ca764e16e15f016e423b85a0fa2a29fb8c7commit-bot@chromium.org    kSHA1_ChecksumType,
1970d75ca764e16e15f016e423b85a0fa2a29fb8c7commit-bot@chromium.org    kMurmur3_ChecksumType,
20cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com};
21ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org
22f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ComputeChecksumBench : public Benchmark {
23ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org    enum {
24142e1fe7cf5dc82e5d4c107b06756302f0cbf96dreed@google.com        U32COUNT  = 256,
25142e1fe7cf5dc82e5d4c107b06756302f0cbf96dreed@google.com        SIZE      = U32COUNT * 4,
26ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org    };
27142e1fe7cf5dc82e5d4c107b06756302f0cbf96dreed@google.com    uint32_t    fData[U32COUNT];
28cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com    ChecksumType fType;
29ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org
30ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.orgpublic:
31410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ComputeChecksumBench(ChecksumType type) : fType(type) {
32e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
33142e1fe7cf5dc82e5d4c107b06756302f0cbf96dreed@google.com        for (int i = 0; i < U32COUNT; ++i) {
34142e1fe7cf5dc82e5d4c107b06756302f0cbf96dreed@google.com            fData[i] = rand.nextU();
35ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org        }
36644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
37644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
38644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
39644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
40ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org    }
41ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org
42ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.orgprotected:
43142e1fe7cf5dc82e5d4c107b06756302f0cbf96dreed@google.com    virtual const char* onGetName() {
44cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com        switch (fType) {
45cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            case kChecksum_ChecksumType: return "compute_checksum";
46cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            case kMD5_ChecksumType: return "compute_md5";
47cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            case kSHA1_ChecksumType: return "compute_sha1";
4870d75ca764e16e15f016e423b85a0fa2a29fb8c7commit-bot@chromium.org            case kMurmur3_ChecksumType: return "compute_murmur3";
4970d75ca764e16e15f016e423b85a0fa2a29fb8c7commit-bot@chromium.org
50cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            default: SK_CRASH(); return "";
51cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com        }
52ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org    }
53ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org
543361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) {
55cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com        switch (fType) {
56cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            case kChecksum_ChecksumType: {
573361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; i++) {
58cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                    volatile uint32_t result = SkChecksum::Compute(fData, sizeof(fData));
597de18e5c7b4e4a8ad8910b1016688ded902f185bbungeman@google.com                    sk_ignore_unused_variable(result);
60cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                }
61cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            } break;
62cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            case kMD5_ChecksumType: {
633361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; i++) {
64cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                    SkMD5 md5;
65cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                    md5.update(reinterpret_cast<uint8_t*>(fData), sizeof(fData));
66cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                    SkMD5::Digest digest;
67cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                    md5.finish(digest);
68cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                }
69cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            } break;
70cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            case kSHA1_ChecksumType: {
713361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; i++) {
72cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                    SkSHA1 sha1;
73cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                    sha1.update(reinterpret_cast<uint8_t*>(fData), sizeof(fData));
74cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                    SkSHA1::Digest digest;
75cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                    sha1.finish(digest);
76cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com                }
77cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com            } break;
7870d75ca764e16e15f016e423b85a0fa2a29fb8c7commit-bot@chromium.org            case kMurmur3_ChecksumType: {
793361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; i++) {
8070d75ca764e16e15f016e423b85a0fa2a29fb8c7commit-bot@chromium.org                    volatile uint32_t result = SkChecksum::Murmur3(fData, sizeof(fData));
8170d75ca764e16e15f016e423b85a0fa2a29fb8c7commit-bot@chromium.org                    sk_ignore_unused_variable(result);
8270d75ca764e16e15f016e423b85a0fa2a29fb8c7commit-bot@chromium.org                }
8370d75ca764e16e15f016e423b85a0fa2a29fb8c7commit-bot@chromium.org            }break;
8488db9ef0cd8646171f35a3325706291070b5dc55reed@google.com        }
85cfcb1bef94a8cfb565d9450b38f57d4f5c83790abungeman@google.com
8688db9ef0cd8646171f35a3325706291070b5dc55reed@google.com    }
87142e1fe7cf5dc82e5d4c107b06756302f0cbf96dreed@google.com
88ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.orgprivate:
89f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
90ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org};
91ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org
92ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org///////////////////////////////////////////////////////////////////////////////
93ef76060cbf36032a5bef9cd8d18138704349c3aejunov@chromium.org
94410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ComputeChecksumBench(kChecksum_ChecksumType); )
95410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ComputeChecksumBench(kMD5_ChecksumType); )
96410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ComputeChecksumBench(kSHA1_ChecksumType); )
97410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ComputeChecksumBench(kMurmur3_ChecksumType); )
98