diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index 1fb9ac5..54aafeaa 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -314,7 +314,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();
 
