OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |