diff options
author | erg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-11 17:46:08 +0000 |
---|---|---|
committer | erg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-11 17:46:08 +0000 |
commit | 98947a0beaa29f997e77e010cfaec72666e045e2 (patch) | |
tree | 7ed453cb5d337cf6d83208a16a95d0e1394be0b2 /chrome/browser/task_manager.cc | |
parent | e2327e1c76276b05492c4d7909432d323c7fdb55 (diff) | |
download | chromium_src-98947a0beaa29f997e77e010cfaec72666e045e2.zip chromium_src-98947a0beaa29f997e77e010cfaec72666e045e2.tar.gz chromium_src-98947a0beaa29f997e77e010cfaec72666e045e2.tar.bz2 |
Speed up the Task Manager on linux.
- Unify the calls to get shared memory and private memory. On Linux, these call the same API and on Linux, it takes >10ms to fetch both values each time it is called.
- Cache the returned memory values. While sorting the task manager by memory, it would make the expensive memory call for each row on each sort operation.
BUG=40033
TEST=Existing task manager tests.
Review URL: http://codereview.chromium.org/2047009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@46938 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/task_manager.cc')
-rw-r--r-- | chrome/browser/task_manager.cc | 56 |
1 files changed, 41 insertions, 15 deletions
diff --git a/chrome/browser/task_manager.cc b/chrome/browser/task_manager.cc index a604b70..1d2907a 100644 --- a/chrome/browser/task_manager.cc +++ b/chrome/browser/task_manager.cc @@ -404,25 +404,34 @@ double TaskManagerModel::GetCPUUsage(TaskManager::Resource* resource) const { } bool TaskManagerModel::GetPrivateMemory(int index, size_t* result) const { - *result = 0; - base::ProcessMetrics* process_metrics; - if (!GetProcessMetricsForRow(index, &process_metrics)) - return false; - *result = process_metrics->GetPrivateBytes(); - if (*result == 0) - return false; + base::ProcessHandle handle = resources_[index]->GetProcess(); + MemoryUsageMap::const_iterator iter = memory_usage_map_.find(handle); + if (iter == memory_usage_map_.end()) { + std::pair<size_t, size_t> usage; + if (!GetAndCacheMemoryMetrics(handle, &usage)) + return false; + + *result = usage.first; + } else { + *result = iter->second.first; + } + return true; } bool TaskManagerModel::GetSharedMemory(int index, size_t* result) const { - *result = 0; - base::ProcessMetrics* process_metrics; - if (!GetProcessMetricsForRow(index, &process_metrics)) - return false; - base::WorkingSetKBytes ws_usage; - if (!process_metrics->GetWorkingSetKBytes(&ws_usage)) - return false; - *result = ws_usage.shared * 1024; + base::ProcessHandle handle = resources_[index]->GetProcess(); + MemoryUsageMap::const_iterator iter = memory_usage_map_.find(handle); + if (iter == memory_usage_map_.end()) { + std::pair<size_t, size_t> usage; + if (!GetAndCacheMemoryMetrics(handle, &usage)) + return false; + + *result = usage.second; + } else { + *result = iter->second.second; + } + return true; } @@ -718,6 +727,9 @@ void TaskManagerModel::Refresh() { cpu_usage_map_[process] = metrics_iter->second->GetCPUUsage(); } + // Clear the memory values so they can be querried lazily. + memory_usage_map_.clear(); + // Compute the new network usage values. displayed_network_usage_map_.clear(); for (ResourceValueMap::iterator iter = current_byte_count_map_.begin(); @@ -952,3 +964,17 @@ void TaskManager::OpenAboutMemory() { browser->window()->Show(); } } + +bool TaskManagerModel::GetAndCacheMemoryMetrics( + base::ProcessHandle handle, + std::pair<size_t, size_t>* usage) const { + MetricsMap::const_iterator iter = metrics_map_.find(handle); + if (iter == metrics_map_.end()) + return false; + + if (!iter->second->GetMemoryBytes(&usage->first, &usage->second)) + return false; + + memory_usage_map_.insert(std::make_pair(handle, *usage)); + return true; +} |