1602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com/*
2602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com * Copyright 2013 Google Inc.
3602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com *
4602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com * Use of this source code is governed by a BSD-style license that can be
5602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com * found in the LICENSE file.
6602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com */
7602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9011f39aeb2b9715546eb74d9ebb71be7baf95fdereed#include "SkResourceCache.h"
10602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
1104617139f7f715bdc05a32a58e65e3c208bccff4reednamespace {
1204617139f7f715bdc05a32a58e65e3c208bccff4reedstatic void* gGlobalAddress;
13011f39aeb2b9715546eb74d9ebb71be7baf95fdereedclass TestKey : public SkResourceCache::Key {
1404617139f7f715bdc05a32a58e65e3c208bccff4reedpublic:
1504617139f7f715bdc05a32a58e65e3c208bccff4reed    void*    fPtr;
1604617139f7f715bdc05a32a58e65e3c208bccff4reed    intptr_t fValue;
1704617139f7f715bdc05a32a58e65e3c208bccff4reed
1804617139f7f715bdc05a32a58e65e3c208bccff4reed    TestKey(intptr_t value) : fPtr(&gGlobalAddress), fValue(value) {
1904617139f7f715bdc05a32a58e65e3c208bccff4reed        this->init(sizeof(fPtr) + sizeof(fValue));
2004617139f7f715bdc05a32a58e65e3c208bccff4reed    }
2104617139f7f715bdc05a32a58e65e3c208bccff4reed};
22011f39aeb2b9715546eb74d9ebb71be7baf95fdereedstruct TestRec : public SkResourceCache::Rec {
23680fb9e8f10d24b5fe35c90338de37c57392f1aareed    TestKey     fKey;
24680fb9e8f10d24b5fe35c90338de37c57392f1aareed    intptr_t    fValue;
25680fb9e8f10d24b5fe35c90338de37c57392f1aareed
26680fb9e8f10d24b5fe35c90338de37c57392f1aareed    TestRec(const TestKey& key, intptr_t value) : fKey(key), fValue(value) {}
27680fb9e8f10d24b5fe35c90338de37c57392f1aareed
28680fb9e8f10d24b5fe35c90338de37c57392f1aareed    virtual const Key& getKey() const SK_OVERRIDE { return fKey; }
29680fb9e8f10d24b5fe35c90338de37c57392f1aareed    virtual size_t bytesUsed() const SK_OVERRIDE { return sizeof(fKey) + sizeof(fValue); }
30c90e0149ec530075cae7bf51072a16628311855ereed
31c90e0149ec530075cae7bf51072a16628311855ereed    static bool Visitor(const SkResourceCache::Rec&, void*) {
32c90e0149ec530075cae7bf51072a16628311855ereed        return true;
33c90e0149ec530075cae7bf51072a16628311855ereed    }
34680fb9e8f10d24b5fe35c90338de37c57392f1aareed};
3504617139f7f715bdc05a32a58e65e3c208bccff4reed}
3604617139f7f715bdc05a32a58e65e3c208bccff4reed
37f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ImageCacheBench : public Benchmark {
38011f39aeb2b9715546eb74d9ebb71be7baf95fdereed    SkResourceCache fCache;
39602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
40602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com    enum {
41602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com        CACHE_COUNT = 500
42602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com    };
43602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.compublic:
44011f39aeb2b9715546eb74d9ebb71be7baf95fdereed    ImageCacheBench()  : fCache(CACHE_COUNT * 100) {}
45602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
46602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com    void populateCache() {
47602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com        for (int i = 0; i < CACHE_COUNT; ++i) {
48c90e0149ec530075cae7bf51072a16628311855ereed            fCache.add(SkNEW_ARGS(TestRec, (TestKey(i), i)));
49602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com        }
50602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com    }
51602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
52602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.comprotected:
53602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com    virtual const char* onGetName() SK_OVERRIDE {
54602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com        return "imagecache";
55602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com    }
56602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
573361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
58805ef159d197007b9529e60e5b918ee0f9d3802dhalcanary        if (fCache.getTotalBytesUsed() == 0) {
59602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com            this->populateCache();
60602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com        }
61602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
6204617139f7f715bdc05a32a58e65e3c208bccff4reed        TestKey key(-1);
63680fb9e8f10d24b5fe35c90338de37c57392f1aareed        // search for a miss (-1)
643361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
65c90e0149ec530075cae7bf51072a16628311855ereed            SkDEBUGCODE(bool found =) fCache.find(key, TestRec::Visitor, NULL);
66c90e0149ec530075cae7bf51072a16628311855ereed            SkASSERT(!found);
67602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com        }
68602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com    }
69602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
70602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.comprivate:
71f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
72602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com};
73602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
74602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com///////////////////////////////////////////////////////////////////////////////
75602a1d70257eb3fcb746d758577f042d8c94f6d9reed@google.com
76410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ImageCacheBench(); )
77