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