diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index c232bd1..3f0126f 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -316,7 +316,8 @@
     tests/microbench/DisplayListCanvasBench.cpp \
     tests/microbench/LinearAllocatorBench.cpp \
     tests/microbench/PathParserBench.cpp \
-    tests/microbench/ShadowBench.cpp
+    tests/microbench/ShadowBench.cpp \
+    tests/microbench/TaskManagerBench.cpp
 
 ifeq (true, $(HWUI_NEW_OPS))
     LOCAL_SRC_FILES += \
diff --git a/libs/hwui/tests/microbench/TaskManagerBench.cpp b/libs/hwui/tests/microbench/TaskManagerBench.cpp
new file mode 100644
index 0000000..0ea30e47
--- /dev/null
+++ b/libs/hwui/tests/microbench/TaskManagerBench.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <benchmark/Benchmark.h>
+
+#include "thread/Task.h"
+#include "thread/TaskManager.h"
+#include "thread/TaskProcessor.h"
+#include "tests/microbench/MicroBench.h"
+
+#include <vector>
+
+using namespace android;
+using namespace android::uirenderer;
+
+class TrivialTask : public Task<char> {};
+
+class TrivialProcessor : public TaskProcessor<char> {
+public:
+    TrivialProcessor(TaskManager* manager)
+            : TaskProcessor(manager) {}
+    virtual ~TrivialProcessor() {}
+    virtual void onProcess(const sp<Task<char> >& task) override {
+        TrivialTask* t = static_cast<TrivialTask*>(task.get());
+        t->setResult(reinterpret_cast<intptr_t>(t) % 16 == 0 ? 'a' : 'b');
+    }
+};
+
+BENCHMARK_NO_ARG(BM_TaskManager_allocateTask);
+void BM_TaskManager_allocateTask::Run(int iters) {
+    std::vector<sp<TrivialTask> > tasks;
+    tasks.reserve(iters);
+
+    StartBenchmarkTiming();
+    for (int i = 0; i < iters; i++) {
+        tasks.emplace_back(new TrivialTask);
+        MicroBench::DoNotOptimize(tasks.back());
+    }
+    StopBenchmarkTiming();
+}
+
+BENCHMARK_NO_ARG(BM_TaskManager_enqueueTask);
+void BM_TaskManager_enqueueTask::Run(int iters) {
+    TaskManager taskManager;
+    sp<TrivialProcessor> processor(new TrivialProcessor(&taskManager));
+    std::vector<sp<TrivialTask> > tasks;
+    tasks.reserve(iters);
+
+    StartBenchmarkTiming();
+    for (int i = 0; i < iters; i++) {
+        tasks.emplace_back(new TrivialTask);
+        MicroBench::DoNotOptimize(tasks.back());
+        processor->add(tasks.back());
+    }
+    StopBenchmarkTiming();
+
+    for (sp<TrivialTask>& task : tasks) {
+        task->getResult();
+    }
+}
+
+BENCHMARK_NO_ARG(BM_TaskManager_enqueueRunDeleteTask);
+void BM_TaskManager_enqueueRunDeleteTask::Run(int iters) {
+    TaskManager taskManager;
+    sp<TrivialProcessor> processor(new TrivialProcessor(&taskManager));
+    std::vector<sp<TrivialTask> > tasks;
+    tasks.reserve(iters);
+
+    StartBenchmarkTiming();
+    for (int i = 0; i < iters; i++) {
+        tasks.emplace_back(new TrivialTask);
+        MicroBench::DoNotOptimize(tasks.back());
+        processor->add(tasks.back());
+    }
+    for (sp<TrivialTask>& task : tasks) {
+        MicroBench::DoNotOptimize(task->getResult());
+    }
+    tasks.clear();
+    StopBenchmarkTiming();
+}
diff --git a/libs/hwui/thread/TaskManager.cpp b/libs/hwui/thread/TaskManager.cpp
index a07845e..d346b85 100644
--- a/libs/hwui/thread/TaskManager.cpp
+++ b/libs/hwui/thread/TaskManager.cpp
@@ -103,7 +103,7 @@
     return true;
 }
 
-bool TaskManager::WorkerThread::addTask(TaskWrapper task) {
+bool TaskManager::WorkerThread::addTask(const TaskWrapper& task) {
     if (!isRunning()) {
         run(mName.string(), PRIORITY_DEFAULT);
     } else if (exitPending()) {
diff --git a/libs/hwui/thread/TaskManager.h b/libs/hwui/thread/TaskManager.h
index d0eb304..e4808f7 100644
--- a/libs/hwui/thread/TaskManager.h
+++ b/libs/hwui/thread/TaskManager.h
@@ -80,7 +80,7 @@
     public:
         WorkerThread(const String8 name): mSignal(Condition::WAKE_UP_ONE), mName(name) { }
 
-        bool addTask(TaskWrapper task);
+        bool addTask(const TaskWrapper& task);
         size_t getTaskCount() const;
         void exit();
 
