1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkResourceCache.h" 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker namespace { 12*c8dee2aaSAndroid Build Coastguard Worker static void* gGlobalAddress; 13*c8dee2aaSAndroid Build Coastguard Worker class TestKey : public SkResourceCache::Key { 14*c8dee2aaSAndroid Build Coastguard Worker public: 15*c8dee2aaSAndroid Build Coastguard Worker intptr_t fValue; 16*c8dee2aaSAndroid Build Coastguard Worker TestKey(intptr_t value)17*c8dee2aaSAndroid Build Coastguard Worker TestKey(intptr_t value) : fValue(value) { 18*c8dee2aaSAndroid Build Coastguard Worker this->init(&gGlobalAddress, 0, sizeof(fValue)); 19*c8dee2aaSAndroid Build Coastguard Worker } 20*c8dee2aaSAndroid Build Coastguard Worker }; 21*c8dee2aaSAndroid Build Coastguard Worker struct TestRec : public SkResourceCache::Rec { 22*c8dee2aaSAndroid Build Coastguard Worker TestKey fKey; 23*c8dee2aaSAndroid Build Coastguard Worker intptr_t fValue; 24*c8dee2aaSAndroid Build Coastguard Worker TestRec__anon3d0390f50111::TestRec25*c8dee2aaSAndroid Build Coastguard Worker TestRec(const TestKey& key, intptr_t value) : fKey(key), fValue(value) {} 26*c8dee2aaSAndroid Build Coastguard Worker getKey__anon3d0390f50111::TestRec27*c8dee2aaSAndroid Build Coastguard Worker const Key& getKey() const override { return fKey; } bytesUsed__anon3d0390f50111::TestRec28*c8dee2aaSAndroid Build Coastguard Worker size_t bytesUsed() const override { return sizeof(fKey) + sizeof(fValue); } getCategory__anon3d0390f50111::TestRec29*c8dee2aaSAndroid Build Coastguard Worker const char* getCategory() const override { return "imagecachebench-test"; } diagnostic_only_getDiscardable__anon3d0390f50111::TestRec30*c8dee2aaSAndroid Build Coastguard Worker SkDiscardableMemory* diagnostic_only_getDiscardable() const override { return nullptr; } 31*c8dee2aaSAndroid Build Coastguard Worker Visitor__anon3d0390f50111::TestRec32*c8dee2aaSAndroid Build Coastguard Worker static bool Visitor(const SkResourceCache::Rec&, void*) { 33*c8dee2aaSAndroid Build Coastguard Worker return true; 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker }; 36*c8dee2aaSAndroid Build Coastguard Worker } // namespace 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker class ImageCacheBench : public Benchmark { 39*c8dee2aaSAndroid Build Coastguard Worker SkResourceCache fCache; 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker enum { 42*c8dee2aaSAndroid Build Coastguard Worker CACHE_COUNT = 500 43*c8dee2aaSAndroid Build Coastguard Worker }; 44*c8dee2aaSAndroid Build Coastguard Worker public: ImageCacheBench()45*c8dee2aaSAndroid Build Coastguard Worker ImageCacheBench() : fCache(CACHE_COUNT * 100) {} 46*c8dee2aaSAndroid Build Coastguard Worker populateCache()47*c8dee2aaSAndroid Build Coastguard Worker void populateCache() { 48*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < CACHE_COUNT; ++i) { 49*c8dee2aaSAndroid Build Coastguard Worker fCache.add(new TestRec(TestKey(i), i)); 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker } 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()54*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 55*c8dee2aaSAndroid Build Coastguard Worker return "imagecache"; 56*c8dee2aaSAndroid Build Coastguard Worker } 57*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas *)58*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas*) override { 59*c8dee2aaSAndroid Build Coastguard Worker if (fCache.getTotalBytesUsed() == 0) { 60*c8dee2aaSAndroid Build Coastguard Worker this->populateCache(); 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker TestKey key(-1); 64*c8dee2aaSAndroid Build Coastguard Worker // search for a miss (-1) 65*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 66*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(bool found =) fCache.find(key, TestRec::Visitor, nullptr); 67*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!found); 68*c8dee2aaSAndroid Build Coastguard Worker } 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker private: 72*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 73*c8dee2aaSAndroid Build Coastguard Worker }; 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new ImageCacheBench(); ) 78