summaryrefslogtreecommitdiffstats
path: root/chrome/browser/task_manager.cc
diff options
context:
space:
mode:
authorerg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-11 17:46:08 +0000
committererg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-11 17:46:08 +0000
commit98947a0beaa29f997e77e010cfaec72666e045e2 (patch)
tree7ed453cb5d337cf6d83208a16a95d0e1394be0b2 /chrome/browser/task_manager.cc
parente2327e1c76276b05492c4d7909432d323c7fdb55 (diff)
downloadchromium_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.cc56
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;
+}