Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: components/startup_metric_utils/browser/startup_metric_utils.cc

Issue 1637493002: Add SameVersionStartupCounts suffix to startup HardFault and Temperature histograms. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@b1_startup_count_metric
Patch Set: merge up to r371436 Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/startup_metric_utils/browser/startup_metric_utils.h" 5 #include "components/startup_metric_utils/browser/startup_metric_utils.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/containers/hash_tables.h" 9 #include "base/containers/hash_tables.h"
10 #include "base/environment.h" 10 #include "base/environment.h"
11 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/metrics/histogram.h"
13 #include "base/metrics/histogram_macros.h" 14 #include "base/metrics/histogram_macros.h"
14 #include "base/prefs/pref_registry_simple.h" 15 #include "base/prefs/pref_registry_simple.h"
15 #include "base/prefs/pref_service.h" 16 #include "base/prefs/pref_service.h"
16 #include "base/process/process_info.h" 17 #include "base/process/process_info.h"
17 #include "base/strings/string_number_conversions.h" 18 #include "base/strings/string_number_conversions.h"
18 #include "base/sys_info.h" 19 #include "base/sys_info.h"
19 #include "base/threading/platform_thread.h" 20 #include "base/threading/platform_thread.h"
20 #include "base/trace_event/trace_event.h" 21 #include "base/trace_event/trace_event.h"
21 #include "build/build_config.h" 22 #include "build/build_config.h"
22 #include "components/startup_metric_utils/browser/pref_names.h" 23 #include "components/startup_metric_utils/browser/pref_names.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 type(basename ".ColdStartup", kValue); \ 131 type(basename ".ColdStartup", kValue); \
131 break; \ 132 break; \
132 case WARM_STARTUP_TEMPERATURE: \ 133 case WARM_STARTUP_TEMPERATURE: \
133 type(basename ".WarmStartup", kValue); \ 134 type(basename ".WarmStartup", kValue); \
134 break; \ 135 break; \
135 case LUKEWARM_STARTUP_TEMPERATURE: \ 136 case LUKEWARM_STARTUP_TEMPERATURE: \
136 type(basename ".LukewarmStartup", kValue); \ 137 type(basename ".LukewarmStartup", kValue); \
137 break; \ 138 break; \
138 case UNDETERMINED_STARTUP_TEMPERATURE: \ 139 case UNDETERMINED_STARTUP_TEMPERATURE: \
139 break; \ 140 break; \
140 case STARTUP_TEMPERATURE_COUNT: \
141 NOTREACHED(); \
142 break; \
143 } \ 141 } \
144 } 142 }
145 143
146 #define UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE( \ 144 #define UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE( \
147 type, basename, begin_ticks, end_ticks) \ 145 type, basename, begin_ticks, end_ticks) \
148 { \ 146 { \
149 UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(type, basename, \ 147 UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(type, basename, \
150 end_ticks - begin_ticks) \ 148 end_ticks - begin_ticks) \
151 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1( \ 149 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1( \
152 "startup", basename, 0, begin_ticks.ToInternalValue(), "Temperature", \ 150 "startup", basename, 0, begin_ticks.ToInternalValue(), "Temperature", \
(...skipping 21 matching lines...) Expand all
174 GetSystemUptimeOnProcessLaunch(); 172 GetSystemUptimeOnProcessLaunch();
175 if (system_uptime_on_process_launch.is_zero()) 173 if (system_uptime_on_process_launch.is_zero())
176 return; 174 return;
177 175
178 UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(UMA_HISTOGRAM_LONG_TIMES_100, 176 UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(UMA_HISTOGRAM_LONG_TIMES_100,
179 "Startup.SystemUptime", 177 "Startup.SystemUptime",
180 GetSystemUptimeOnProcessLaunch()); 178 GetSystemUptimeOnProcessLaunch());
181 } 179 }
182 180
183 // On Windows, records the number of hard-faults that have occurred in the 181 // On Windows, records the number of hard-faults that have occurred in the
184 // current chrome.exe process since it was started. This is a nop on other 182 // current chrome.exe process since it was started. A version of the histograms
185 // platforms. 183 // recorded in this method suffixed by |same_version_startup_count| will also be
186 void RecordHardFaultHistogram(bool is_first_run) { 184 // recorded (unless |same_version_startup_count| is 0 which indicates it's
185 // unknown). This is a nop on other platforms.
186 void RecordHardFaultHistogram(int same_version_startup_count) {
187 #if defined(OS_WIN) 187 #if defined(OS_WIN)
188 uint32_t hard_fault_count = 0; 188 uint32_t hard_fault_count = 0;
189 189
190 // Don't log a histogram value if unable to get the hard fault count. 190 // Don't record histograms if unable to get the hard fault count.
191 if (!GetHardFaultCountForCurrentProcess(&hard_fault_count)) 191 if (!GetHardFaultCountForCurrentProcess(&hard_fault_count))
192 return; 192 return;
193 193
194 std::string same_version_startup_count_suffix;
195 if (same_version_startup_count != 0) {
196 // Histograms below will be suffixed by |same_version_startup_count| up to
197 // |kMaxSameVersionCountRecorded|, higher counts will be grouped in the
198 // ".Over" suffix. Make sure to reflect changes to
199 // kMaxSameVersionCountRecorded in the "SameVersionStartupCounts" histogram
200 // suffix.
201 const int kMaxSameVersionCountRecorded = 9;
202 same_version_startup_count_suffix.push_back('.');
203 DCHECK_GE(same_version_startup_count, 1);
204 if (same_version_startup_count <= kMaxSameVersionCountRecorded) {
205 same_version_startup_count_suffix.append(
206 base::IntToString(same_version_startup_count));
207 } else {
208 same_version_startup_count_suffix.append("Over");
209 }
210 }
211
194 // Hard fault counts are expected to be in the thousands range, 212 // Hard fault counts are expected to be in the thousands range,
195 // corresponding to faulting in ~10s of MBs of code ~10s of KBs at a time. 213 // corresponding to faulting in ~10s of MBs of code ~10s of KBs at a time.
196 // (Observed to vary from 1000 to 10000 on various test machines and 214 // (Observed to vary from 1000 to 10000 on various test machines and
197 // platforms.) 215 // platforms.)
198 if (is_first_run) { 216 const char kHardFaultCountHistogram[] =
199 UMA_HISTOGRAM_CUSTOM_COUNTS( 217 "Startup.BrowserMessageLoopStartHardFaultCount";
200 "Startup.BrowserMessageLoopStartHardFaultCount.FirstRun", 218 UMA_HISTOGRAM_CUSTOM_COUNTS(kHardFaultCountHistogram, hard_fault_count, 1,
201 hard_fault_count, 219 40000, 50);
202 0, 40000, 50); 220 // Also record the hard fault count histogram suffixed by the number of
203 } else { 221 // startups this specific version has been through.
204 UMA_HISTOGRAM_CUSTOM_COUNTS( 222 // Factory properties copied from UMA_HISTOGRAM_CUSTOM_COUNTS macro.
205 "Startup.BrowserMessageLoopStartHardFaultCount", 223 if (!same_version_startup_count_suffix.empty()) {
206 hard_fault_count, 224 base::Histogram::FactoryGet(
207 0, 40000, 50); 225 kHardFaultCountHistogram + same_version_startup_count_suffix, 1, 40000,
226 50, base::HistogramBase::kUmaTargetedHistogramFlag)
227 ->Add(hard_fault_count);
208 } 228 }
209 229
210 // Determine the startup type based on the number of observed hard faults. 230 // Determine the startup type based on the number of observed hard faults.
211 DCHECK_EQ(UNDETERMINED_STARTUP_TEMPERATURE, g_startup_temperature); 231 DCHECK_EQ(UNDETERMINED_STARTUP_TEMPERATURE, g_startup_temperature);
212 if (hard_fault_count < WARM_START_HARD_FAULT_COUNT_THRESHOLD) { 232 if (hard_fault_count < WARM_START_HARD_FAULT_COUNT_THRESHOLD) {
213 g_startup_temperature = WARM_STARTUP_TEMPERATURE; 233 g_startup_temperature = WARM_STARTUP_TEMPERATURE;
214 } else if (hard_fault_count >= COLD_START_HARD_FAULT_COUNT_THRESHOLD) { 234 } else if (hard_fault_count >= COLD_START_HARD_FAULT_COUNT_THRESHOLD) {
215 g_startup_temperature = COLD_STARTUP_TEMPERATURE; 235 g_startup_temperature = COLD_STARTUP_TEMPERATURE;
216 } else { 236 } else {
217 g_startup_temperature = LUKEWARM_STARTUP_TEMPERATURE; 237 g_startup_temperature = LUKEWARM_STARTUP_TEMPERATURE;
218 } 238 }
219 239
220 // Record the startup 'temperature'. 240 // Record the startup 'temperature'.
221 UMA_HISTOGRAM_ENUMERATION( 241 const char kStartupTemperatureHistogram[] = "Startup.Temperature";
222 "Startup.Temperature", g_startup_temperature, STARTUP_TEMPERATURE_COUNT); 242 UMA_HISTOGRAM_ENUMERATION(kStartupTemperatureHistogram, g_startup_temperature,
243 STARTUP_TEMPERATURE_MAX);
fdoray 2016/01/26 12:13:21 The comment above the definition of UMA_HISTOGRAM_
gab 2016/01/26 17:59:18 Ah, I missed that comment and only looked at the c
gab 2016/01/26 18:04:20 Looking at this closer, the reason I thought this
jwd 2016/01/26 18:47:18 fdoray is correct, the boundary value should be st
gab 2016/01/26 20:10:22 Aaaah got it, makes sense, thanks! (maybe the com
jwd 2016/01/26 21:45:37 Clearer in what sense? The comment on UMA_HISTOGRA
gab 2016/01/26 22:11:32 I guess I'm bad at reading comment and prefer to f
244 // As well as its suffixed twin.
245 // Factory properties copied from UMA_HISTOGRAM_ENUMERATION macro.
246 if (!same_version_startup_count_suffix.empty()) {
247 base::LinearHistogram::FactoryGet(
248 kStartupTemperatureHistogram + same_version_startup_count_suffix, 1,
249 STARTUP_TEMPERATURE_MAX, STARTUP_TEMPERATURE_MAX + 1,
250 base::HistogramBase::kUmaTargetedHistogramFlag)
251 ->Add(g_startup_temperature);
252 }
223 #endif // defined(OS_WIN) 253 #endif // defined(OS_WIN)
224 } 254 }
225 255
226 // Converts a base::Time value to a base::TimeTicks value. The conversion isn't 256 // Converts a base::Time value to a base::TimeTicks value. The conversion isn't
227 // exact, but by capturing Time::Now() as early as possible, the likelihood of a 257 // exact, but by capturing Time::Now() as early as possible, the likelihood of a
228 // clock change between it and process start is as low as possible. There is 258 // clock change between it and process start is as low as possible. There is
229 // also the time taken to synchronously resolve base::Time::Now() and 259 // also the time taken to synchronously resolve base::Time::Now() and
230 // base::TimeTicks::Now() at play, but in practice it is pretty much instant 260 // base::TimeTicks::Now() at play, but in practice it is pretty much instant
231 // compared to multi-seconds startup timings. 261 // compared to multi-seconds startup timings.
232 base::TimeTicks StartupTimeToTimeTicks(const base::Time& time) { 262 base::TimeTicks StartupTimeToTimeTicks(const base::Time& time) {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 g_browser_main_entry_point_ticks.Get().ToInternalValue()); 366 g_browser_main_entry_point_ticks.Get().ToInternalValue());
337 367
338 if (!g_process_creation_ticks.Get().is_null()) 368 if (!g_process_creation_ticks.Get().is_null())
339 { 369 {
340 TRACE_EVENT_INSTANT_WITH_TIMESTAMP0( 370 TRACE_EVENT_INSTANT_WITH_TIMESTAMP0(
341 "startup", "Startup.BrowserProcessCreation", 0, 371 "startup", "Startup.BrowserProcessCreation", 0,
342 g_process_creation_ticks.Get().ToInternalValue()); 372 g_process_creation_ticks.Get().ToInternalValue());
343 } 373 }
344 } 374 }
345 375
376 // Logs the Startup.TimeSinceLastStartup histogram. Obtains the timestamp of the
377 // last startup from |pref_service| and overwrites it with the timestamp of the
378 // current startup. If the startup temperature has been set by
379 // RecordBrowserMainMessageLoopStart, the time since last startup is also logged
380 // to an histogram suffixed with the startup temperature.
381 void RecordTimeSinceLastStartup(PrefService* pref_service) {
382 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
383 DCHECK(pref_service);
384
385 // Get the timestamp of the current startup.
386 const base::Time process_start_time =
387 base::CurrentProcessInfo::CreationTime();
388
389 // Get the timestamp of the last startup from |pref_service|.
390 const int64_t last_startup_timestamp_internal =
391 pref_service->GetInt64(prefs::kLastStartupTimestamp);
392 if (last_startup_timestamp_internal != 0) {
393 // Log the Startup.TimeSinceLastStartup histogram.
394 const base::Time last_startup_timestamp =
395 base::Time::FromInternalValue(last_startup_timestamp_internal);
396 const base::TimeDelta time_since_last_startup =
397 process_start_time - last_startup_timestamp;
398 const int minutes_since_last_startup = time_since_last_startup.InMinutes();
399
400 // Ignore negative values, which can be caused by system clock changes.
401 if (minutes_since_last_startup >= 0) {
402 UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(
403 UMA_HISTOGRAM_TIME_IN_MINUTES_MONTH_RANGE,
404 "Startup.TimeSinceLastStartup", minutes_since_last_startup);
405 }
406 }
407
408 // Write the timestamp of the current startup in |pref_service|.
409 pref_service->SetInt64(prefs::kLastStartupTimestamp,
410 process_start_time.ToInternalValue());
411 #endif // defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
412 }
413
414 // Logs the Startup.SameVersionStartupCount histogram. Relies on |pref_service|
415 // to know information about the previous startups and store information for
416 // future ones. Returns the number of startups with the same version count that
417 // was logged.
418 int RecordSameVersionStartupCount(PrefService* pref_service) {
419 DCHECK(pref_service);
420
421 const std::string current_version = version_info::GetVersionNumber();
422
423 int startups_with_current_version = 0;
424 if (current_version == pref_service->GetString(prefs::kLastStartupVersion)) {
425 startups_with_current_version =
426 pref_service->GetInteger(prefs::kSameVersionStartupCount);
427 ++startups_with_current_version;
428 pref_service->SetInteger(prefs::kSameVersionStartupCount,
429 startups_with_current_version);
430 } else {
431 startups_with_current_version = 1;
432 pref_service->SetString(prefs::kLastStartupVersion, current_version);
433 pref_service->SetInteger(prefs::kSameVersionStartupCount, 1);
434 }
435
436 UMA_HISTOGRAM_COUNTS_100("Startup.SameVersionStartupCount",
437 startups_with_current_version);
438 return startups_with_current_version;
439 }
440
346 } // namespace 441 } // namespace
347 442
348 #if defined(OS_WIN) 443 #if defined(OS_WIN)
349 bool GetHardFaultCountForCurrentProcess(uint32_t* hard_fault_count) { 444 bool GetHardFaultCountForCurrentProcess(uint32_t* hard_fault_count) {
350 DCHECK(hard_fault_count); 445 DCHECK(hard_fault_count);
351 446
352 if (base::win::GetVersion() < base::win::VERSION_WIN7) 447 if (base::win::GetVersion() < base::win::VERSION_WIN7)
353 return false; 448 return false;
354 449
355 // Get the function pointer. 450 // Get the function pointer.
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 } 532 }
438 533
439 void RecordExeMainEntryPointTime(const base::Time& time) { 534 void RecordExeMainEntryPointTime(const base::Time& time) {
440 const std::string exe_load_ticks = 535 const std::string exe_load_ticks =
441 base::Int64ToString(StartupTimeToTimeTicks(time).ToInternalValue()); 536 base::Int64ToString(StartupTimeToTimeTicks(time).ToInternalValue());
442 scoped_ptr<base::Environment> env(base::Environment::Create()); 537 scoped_ptr<base::Environment> env(base::Environment::Create());
443 env->SetVar(kChromeMainTicksEnvVar, exe_load_ticks); 538 env->SetVar(kChromeMainTicksEnvVar, exe_load_ticks);
444 } 539 }
445 540
446 void RecordBrowserMainMessageLoopStart(const base::TimeTicks& ticks, 541 void RecordBrowserMainMessageLoopStart(const base::TimeTicks& ticks,
447 bool is_first_run) { 542 bool is_first_run,
543 PrefService* pref_service) {
544 int same_version_startup_count = 0;
545 if (pref_service)
546 same_version_startup_count = RecordSameVersionStartupCount(pref_service);
547 // Keep RecordHardFaultHistogram() first as much as possible as many other
548 // histograms depend on it setting |g_startup_temperature|.
549 RecordHardFaultHistogram(same_version_startup_count);
448 AddStartupEventsForTelemetry(); 550 AddStartupEventsForTelemetry();
449 RecordHardFaultHistogram(is_first_run); 551 if (pref_service)
552 RecordTimeSinceLastStartup(pref_service);
450 RecordSystemUptimeHistogram(); 553 RecordSystemUptimeHistogram();
451 RecordMainEntryTimeHistogram(); 554 RecordMainEntryTimeHistogram();
452 555
453 const base::TimeTicks& process_creation_ticks = 556 const base::TimeTicks& process_creation_ticks =
454 g_process_creation_ticks.Get(); 557 g_process_creation_ticks.Get();
455 if (!is_first_run && !process_creation_ticks.is_null()) { 558 if (!is_first_run && !process_creation_ticks.is_null()) {
456 UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE( 559 UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
457 UMA_HISTOGRAM_LONG_TIMES_100, "Startup.BrowserMessageLoopStartTime", 560 UMA_HISTOGRAM_LONG_TIMES_100, "Startup.BrowserMessageLoopStartTime",
458 process_creation_ticks, ticks); 561 process_creation_ticks, ticks);
459 } 562 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 601
499 // Process create to chrome.dll:main(). Reported as a histogram only as 602 // Process create to chrome.dll:main(). Reported as a histogram only as
500 // the other two events above are sufficient for tracing purposes. 603 // the other two events above are sufficient for tracing purposes.
501 UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE( 604 UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(
502 UMA_HISTOGRAM_LONG_TIMES, "Startup.LoadTime.ProcessCreateToDllMain", 605 UMA_HISTOGRAM_LONG_TIMES, "Startup.LoadTime.ProcessCreateToDllMain",
503 g_browser_main_entry_point_ticks.Get() - process_creation_ticks); 606 g_browser_main_entry_point_ticks.Get() - process_creation_ticks);
504 } 607 }
505 } 608 }
506 } 609 }
507 610
508 void RecordTimeSinceLastStartup(PrefService* pref_service) {
509 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
510 DCHECK(pref_service);
511
512 // Get the timestamp of the current startup.
513 const base::Time process_start_time =
514 base::CurrentProcessInfo::CreationTime();
515
516 // Get the timestamp of the last startup from |pref_service|.
517 const int64_t last_startup_timestamp_internal =
518 pref_service->GetInt64(prefs::kLastStartupTimestamp);
519 if (last_startup_timestamp_internal != 0) {
520 // Log the Startup.TimeSinceLastStartup histogram.
521 const base::Time last_startup_timestamp =
522 base::Time::FromInternalValue(last_startup_timestamp_internal);
523 const base::TimeDelta time_since_last_startup =
524 process_start_time - last_startup_timestamp;
525 const int minutes_since_last_startup = time_since_last_startup.InMinutes();
526
527 // Ignore negative values, which can be caused by system clock changes.
528 if (minutes_since_last_startup >= 0) {
529 UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(
530 UMA_HISTOGRAM_TIME_IN_MINUTES_MONTH_RANGE,
531 "Startup.TimeSinceLastStartup", minutes_since_last_startup);
532 }
533 }
534
535 // Write the timestamp of the current startup in |pref_service|.
536 pref_service->SetInt64(prefs::kLastStartupTimestamp,
537 process_start_time.ToInternalValue());
538 #endif // defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
539 }
540
541 void RecordStartupCount(PrefService* pref_service) {
542 DCHECK(pref_service);
543
544 const std::string current_version = version_info::GetVersionNumber();
545
546 int startups_with_current_version = 0;
547 if (current_version == pref_service->GetString(prefs::kLastStartupVersion)) {
548 startups_with_current_version =
549 pref_service->GetInteger(prefs::kSameVersionStartupCount);
550 ++startups_with_current_version;
551 pref_service->SetInteger(prefs::kSameVersionStartupCount,
552 startups_with_current_version);
553 } else {
554 startups_with_current_version = 1;
555 pref_service->SetString(prefs::kLastStartupVersion, current_version);
556 pref_service->SetInteger(prefs::kSameVersionStartupCount, 1);
557 }
558
559 UMA_HISTOGRAM_COUNTS_100("Startup.SameVersionStartupCount",
560 startups_with_current_version);
561 }
562
563 void RecordBrowserWindowDisplay(const base::TimeTicks& ticks) { 611 void RecordBrowserWindowDisplay(const base::TimeTicks& ticks) {
564 static bool is_first_call = true; 612 static bool is_first_call = true;
565 if (!is_first_call || ticks.is_null()) 613 if (!is_first_call || ticks.is_null())
566 return; 614 return;
567 is_first_call = false; 615 is_first_call = false;
568 if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null()) 616 if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null())
569 return; 617 return;
570 618
571 UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE( 619 UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
572 UMA_HISTOGRAM_LONG_TIMES, "Startup.BrowserWindowDisplay", 620 UMA_HISTOGRAM_LONG_TIMES, "Startup.BrowserWindowDisplay",
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 700
653 base::TimeTicks MainEntryPointTicks() { 701 base::TimeTicks MainEntryPointTicks() {
654 return g_browser_main_entry_point_ticks.Get(); 702 return g_browser_main_entry_point_ticks.Get();
655 } 703 }
656 704
657 StartupTemperature GetStartupTemperature() { 705 StartupTemperature GetStartupTemperature() {
658 return g_startup_temperature; 706 return g_startup_temperature;
659 } 707 }
660 708
661 } // namespace startup_metric_utils 709 } // namespace startup_metric_utils
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698