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