Commit eaeb5598 authored by reveman@chromium.org's avatar reveman@chromium.org

cc: Replace RasterTaskStateMap with a vector and brute force search instead of hash map lookups.

Also avoids unnecessary heap allocations by recycling old state vector.
Result is ~100% performance improvement to ScheduleTasks.

BUG=269841
TEST=cc_perftests --gtest_filter=RasterWorkerPoolPerfTests/RasterWorkerPoolPerfTest.ScheduleTasks/0

Review URL: https://codereview.chromium.org/174453003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255615 0039d316-1c4b-4281-b951-d872f2087c98
parent b9ecdb69
......@@ -5,22 +5,10 @@
#ifndef CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_
#define CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_
#include <deque>
#include <vector>
#include "base/containers/hash_tables.h"
#include "cc/resources/raster_worker_pool.h"
#if defined(COMPILER_GCC)
namespace BASE_HASH_NAMESPACE {
template <>
struct hash<cc::internal::WorkerPoolTask*> {
size_t operator()(cc::internal::WorkerPoolTask* ptr) const {
return hash<size_t>()(reinterpret_cast<size_t>(ptr));
}
};
} // namespace BASE_HASH_NAMESPACE
#endif // COMPILER
namespace cc {
class CC_EXPORT PixelBufferRasterWorkerPool : public RasterWorkerPool {
......@@ -53,24 +41,33 @@ class CC_EXPORT PixelBufferRasterWorkerPool : public RasterWorkerPool {
private:
struct RasterTaskState {
RasterTaskState()
: type(UNSCHEDULED), resource(NULL), required_for_activation(false) {}
RasterTaskState& set_completed() {
type = COMPLETED;
return *this;
}
RasterTaskState& set_required_for_activation(bool is_required) {
required_for_activation = is_required;
return *this;
}
class TaskComparator {
public:
explicit TaskComparator(const internal::WorkerPoolTask* task)
: task_(task) {}
bool operator()(const RasterTaskState& state) const {
return state.task == task_;
}
private:
const internal::WorkerPoolTask* task_;
};
typedef std::vector<RasterTaskState> Vector;
RasterTaskState(internal::WorkerPoolTask* task,
bool required_for_activation)
: type(UNSCHEDULED),
task(task),
resource(NULL),
required_for_activation(required_for_activation) {}
enum { UNSCHEDULED, SCHEDULED, UPLOADING, COMPLETED } type;
internal::WorkerPoolTask* task;
const Resource* resource;
bool required_for_activation;
};
typedef internal::WorkerPoolTask* RasterTaskMapKey;
typedef base::hash_map<RasterTaskMapKey, RasterTaskState> RasterTaskStateMap;
// Overridden from RasterWorkerPool:
virtual void OnRasterTasksFinished() OVERRIDE;
......@@ -94,10 +91,10 @@ class CC_EXPORT PixelBufferRasterWorkerPool : public RasterWorkerPool {
bool shutdown_;
RasterTaskQueue raster_tasks_;
RasterTaskStateMap raster_task_states_;
RasterTaskState::Vector raster_task_states_;
TaskDeque raster_tasks_with_pending_upload_;
TaskDeque completed_raster_tasks_;
TaskDeque completed_image_decode_tasks_;
TaskVector completed_raster_tasks_;
TaskVector completed_image_decode_tasks_;
size_t scheduled_raster_task_count_;
size_t raster_tasks_required_for_activation_count_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment