1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef CHROME_BROWSER_MAC_MAC_STARTUP_PROFILER_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define CHROME_BROWSER_MAC_MAC_STARTUP_PROFILER_H_
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <map>
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/singleton.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/time.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// A lightweight profiler of startup performance. Records UMA metrics for the
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// time delta between Chrome's launch and major initialization phases.
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MacStartupProfiler {
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns pointer to the singleton instance for the current process.
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static MacStartupProfiler* GetInstance();
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MacStartupProfiler();
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ~MacStartupProfiler();
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // These locations correspond to major phases of Chrome startup.
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Profiling of these locations should occur at the beginning of the method
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // indicated by the enum name.
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The ordering of the enum matches the order in which the initialization
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // phases are reached.
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  enum Location {
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    PRE_MAIN_MESSAGE_LOOP_START,
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AWAKE_FROM_NIB,
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    POST_MAIN_MESSAGE_LOOP_START,
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    PRE_PROFILE_INIT,
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    POST_PROFILE_INIT,
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WILL_FINISH_LAUNCHING,
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DID_FINISH_LAUNCHING,
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Record timestamp for the given location event.
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Profile(Location location);
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Call once to record all UMA metrics for all profiled locations.
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RecordMetrics();
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  friend struct DefaultSingletonTraits<MacStartupProfiler>;
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns the name of the histogram for the given location.
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const std::string HistogramName(Location location);
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Records UMA metrics for a specific location.
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RecordHistogram(Location location, const base::TimeDelta& delta);
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Keeps track of the time at which each initialization phase was reached.
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::map<Location, base::Time> profiled_times_;
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Whether UMA metrics have been recorded. Only record UMA metrics once.
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool recorded_metrics_;
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(MacStartupProfiler);
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // CHROME_BROWSER_MAC_MAC_STARTUP_PROFILER_H_
63