blob: d3ace2fb0f834ec79d9b74351f9f3f3933baa3f2 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MAC_MAC_STARTUP_PROFILER_H_
#define CHROME_BROWSER_MAC_MAC_STARTUP_PROFILER_H_
#include <map>
#include "base/macros.h"
#include "base/memory/singleton.h"
#include "base/time/time.h"
// A lightweight profiler of startup performance. Records UMA metrics for the
// time delta between Chrome's launch and major initialization phases.
class MacStartupProfiler {
public:
// Returns pointer to the singleton instance for the current process.
static MacStartupProfiler* GetInstance();
MacStartupProfiler();
~MacStartupProfiler();
// These locations correspond to major phases of Chrome startup.
// Profiling of these locations should occur at the beginning of the method
// indicated by the enum name.
// The ordering of the enum matches the order in which the initialization
// phases are reached.
enum Location {
PRE_MAIN_MESSAGE_LOOP_START,
AWAKE_FROM_NIB,
POST_MAIN_MESSAGE_LOOP_START,
PRE_PROFILE_INIT,
POST_PROFILE_INIT,
WILL_FINISH_LAUNCHING,
DID_FINISH_LAUNCHING,
};
// Record timestamp for the given location event.
void Profile(Location location);
// Call once to record all UMA metrics for all profiled locations.
void RecordMetrics();
private:
friend struct base::DefaultSingletonTraits<MacStartupProfiler>;
// Returns the name of the histogram for the given location.
const std::string HistogramName(Location location);
// Records UMA metrics for a specific location.
void RecordHistogram(Location location, const base::TimeDelta& delta);
// Keeps track of the time at which each initialization phase was reached.
std::map<Location, base::TimeTicks> profiled_ticks_;
// Whether UMA metrics have been recorded. Only record UMA metrics once.
bool recorded_metrics_;
DISALLOW_COPY_AND_ASSIGN(MacStartupProfiler);
};
#endif // CHROME_BROWSER_MAC_MAC_STARTUP_PROFILER_H_