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