summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbryner@chromium.org <bryner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-18 18:55:07 +0000
committerbryner@chromium.org <bryner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-18 18:55:07 +0000
commita69e947d721537cba9a2e50e634d2432d0834d24 (patch)
treea925fed5e29fde5c4e1f78fc5ce5c107a3b4afff
parent287fe956f5edd1b9915be3402edbf36243fe4ba8 (diff)
downloadchromium_src-a69e947d721537cba9a2e50e634d2432d0834d24.zip
chromium_src-a69e947d721537cba9a2e50e634d2432d0834d24.tar.gz
chromium_src-a69e947d721537cba9a2e50e634d2432d0834d24.tar.bz2
Add a histogram to measure task execution time for the render thread.
BUG=none TEST=none Review URL: http://codereview.chromium.org/6670029 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78728 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/renderer/renderer_main.cc29
1 files changed, 29 insertions, 0 deletions
diff --git a/chrome/renderer/renderer_main.cc b/chrome/renderer/renderer_main.cc
index b04f7d3..06e71d3 100644
--- a/chrome/renderer/renderer_main.cc
+++ b/chrome/renderer/renderer_main.cc
@@ -17,8 +17,10 @@
#include "base/metrics/stats_counters.h"
#include "base/path_service.h"
#include "base/process_util.h"
+#include "base/ref_counted.h"
#include "base/string_util.h"
#include "base/threading/platform_thread.h"
+#include "base/time.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_counters.h"
#include "chrome/common/chrome_switches.h"
@@ -177,6 +179,31 @@ static void HandleRendererErrorTestParameters(const CommandLine& command_line) {
}
}
+// This is a simplified version of the browser Jankometer, which measures
+// the processing time of tasks on the render thread.
+class RendererMessageLoopObserver : public MessageLoop::TaskObserver {
+ public:
+ RendererMessageLoopObserver()
+ : process_times_(base::Histogram::FactoryGet(
+ "Chrome.ProcMsgL RenderThread",
+ 1, 3600000, 50, base::Histogram::kUmaTargetedHistogramFlag)) {}
+ virtual ~RendererMessageLoopObserver() {}
+
+ virtual void WillProcessTask(const Task* task) {
+ begin_process_message_ = base::TimeTicks::Now();
+ }
+
+ virtual void DidProcessTask(const Task* task) {
+ if (begin_process_message_ != base::TimeTicks())
+ process_times_->AddTime(base::TimeTicks::Now() - begin_process_message_);
+ }
+
+ private:
+ base::TimeTicks begin_process_message_;
+ scoped_refptr<base::Histogram> process_times_;
+ DISALLOW_COPY_AND_ASSIGN(RendererMessageLoopObserver);
+};
+
// mainline routine for running as the Renderer process
int RendererMain(const MainFunctionParams& parameters) {
TRACE_EVENT_BEGIN("RendererMain", 0, "");
@@ -239,6 +266,7 @@ int RendererMain(const MainFunctionParams& parameters) {
base::StatsScope<base::StatsCounterTimer>
startup_timer(chrome::Counters::renderer_main());
+ RendererMessageLoopObserver task_observer;
#if defined(OS_MACOSX)
// As long as we use Cocoa in the renderer (for the forseeable future as of
// now; see http://crbug.com/13890 for info) we need to have a UI loop.
@@ -249,6 +277,7 @@ int RendererMain(const MainFunctionParams& parameters) {
MessageLoop main_message_loop(RenderProcessImpl::InProcessPlugins() ?
MessageLoop::TYPE_UI : MessageLoop::TYPE_DEFAULT);
#endif
+ main_message_loop.AddTaskObserver(&task_observer);
base::PlatformThread::SetName("CrRendererMain");