TaskManagerBench.cpp revision d53e3bed1ca4a14b2a86d53eaef6969bd043176e
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <benchmark/benchmark.h> 18 19#include "thread/Task.h" 20#include "thread/TaskManager.h" 21#include "thread/TaskProcessor.h" 22 23#include <vector> 24 25using namespace android; 26using namespace android::uirenderer; 27 28class TrivialTask : public Task<char> {}; 29 30class TrivialProcessor : public TaskProcessor<char> { 31public: 32 explicit TrivialProcessor(TaskManager* manager) 33 : TaskProcessor(manager) {} 34 virtual ~TrivialProcessor() {} 35 virtual void onProcess(const sp<Task<char> >& task) override { 36 TrivialTask* t = static_cast<TrivialTask*>(task.get()); 37 t->setResult(reinterpret_cast<intptr_t>(t) % 16 == 0 ? 'a' : 'b'); 38 } 39}; 40 41void BM_TaskManager_allocateTask(benchmark::State& state) { 42 std::vector<sp<TrivialTask> > tasks; 43 tasks.reserve(state.max_iterations); 44 45 while (state.KeepRunning()) { 46 tasks.emplace_back(new TrivialTask); 47 benchmark::DoNotOptimize(tasks.back()); 48 } 49} 50BENCHMARK(BM_TaskManager_allocateTask); 51 52void BM_TaskManager_enqueueTask(benchmark::State& state) { 53 TaskManager taskManager; 54 sp<TrivialProcessor> processor(new TrivialProcessor(&taskManager)); 55 std::vector<sp<TrivialTask> > tasks; 56 tasks.reserve(state.max_iterations); 57 58 while (state.KeepRunning()) { 59 tasks.emplace_back(new TrivialTask); 60 benchmark::DoNotOptimize(tasks.back()); 61 processor->add(tasks.back()); 62 } 63 64 for (sp<TrivialTask>& task : tasks) { 65 task->getResult(); 66 } 67} 68BENCHMARK(BM_TaskManager_enqueueTask); 69 70void BM_TaskManager_enqueueRunDeleteTask(benchmark::State& state) { 71 TaskManager taskManager; 72 sp<TrivialProcessor> processor(new TrivialProcessor(&taskManager)); 73 std::vector<sp<TrivialTask> > tasks; 74 tasks.reserve(state.max_iterations); 75 76 while (state.KeepRunning()) { 77 tasks.emplace_back(new TrivialTask); 78 benchmark::DoNotOptimize(tasks.back()); 79 processor->add(tasks.back()); 80 } 81 state.ResumeTiming(); 82 for (sp<TrivialTask>& task : tasks) { 83 benchmark::DoNotOptimize(task->getResult()); 84 } 85 tasks.clear(); 86 state.PauseTiming(); 87} 88BENCHMARK(BM_TaskManager_enqueueRunDeleteTask); 89