| 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 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 #include <winternl.h> | 32 #include <winternl.h> |
| 33 #include "base/win/win_util.h" | 33 #include "base/win/win_util.h" |
| 34 #endif | 34 #endif |
| 35 | 35 |
| 36 namespace startup_metric_utils { | 36 namespace startup_metric_utils { |
| 37 | 37 |
| 38 namespace { | 38 namespace { |
| 39 | 39 |
| 40 // Mark as volatile to defensively make sure usage is thread-safe. | 40 // Mark as volatile to defensively make sure usage is thread-safe. |
| 41 // Note that at the time of this writing, access is only on the UI thread. | 41 // Note that at the time of this writing, access is only on the UI thread. |
| 42 volatile bool g_non_browser_ui_displayed = false; | 42 volatile bool g_main_window_startup_interrupted = false; |
| 43 | 43 |
| 44 base::LazyInstance<base::TimeTicks>::Leaky g_process_creation_ticks = | 44 base::LazyInstance<base::TimeTicks>::Leaky g_process_creation_ticks = |
| 45 LAZY_INSTANCE_INITIALIZER; | 45 LAZY_INSTANCE_INITIALIZER; |
| 46 | 46 |
| 47 base::LazyInstance<base::TimeTicks>::Leaky g_browser_main_entry_point_ticks = | 47 base::LazyInstance<base::TimeTicks>::Leaky g_browser_main_entry_point_ticks = |
| 48 LAZY_INSTANCE_INITIALIZER; | 48 LAZY_INSTANCE_INITIALIZER; |
| 49 | 49 |
| 50 base::LazyInstance<base::TimeTicks>::Leaky g_renderer_main_entry_point_ticks = | 50 base::LazyInstance<base::TimeTicks>::Leaky g_renderer_main_entry_point_ticks = |
| 51 LAZY_INSTANCE_INITIALIZER; | 51 LAZY_INSTANCE_INITIALIZER; |
| 52 | 52 |
| (...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 } else { | 541 } else { |
| 542 g_startups_with_current_version = 1; | 542 g_startups_with_current_version = 1; |
| 543 pref_service->SetString(prefs::kLastStartupVersion, current_version); | 543 pref_service->SetString(prefs::kLastStartupVersion, current_version); |
| 544 pref_service->SetInteger(prefs::kSameVersionStartupCount, 1); | 544 pref_service->SetInteger(prefs::kSameVersionStartupCount, 1); |
| 545 } | 545 } |
| 546 | 546 |
| 547 UMA_HISTOGRAM_COUNTS_100("Startup.SameVersionStartupCount", | 547 UMA_HISTOGRAM_COUNTS_100("Startup.SameVersionStartupCount", |
| 548 g_startups_with_current_version); | 548 g_startups_with_current_version); |
| 549 } | 549 } |
| 550 | 550 |
| 551 bool ShouldLogProcessCreationTicksHistogram() { |
| 552 return !WasMainWindowStartupInterrupted() && |
| 553 !g_process_creation_ticks.Get().is_null(); |
| 554 } |
| 555 |
| 551 } // namespace | 556 } // namespace |
| 552 | 557 |
| 553 void RegisterPrefs(PrefRegistrySimple* registry) { | 558 void RegisterPrefs(PrefRegistrySimple* registry) { |
| 554 DCHECK(registry); | 559 DCHECK(registry); |
| 555 registry->RegisterInt64Pref(prefs::kLastStartupTimestamp, 0); | 560 registry->RegisterInt64Pref(prefs::kLastStartupTimestamp, 0); |
| 556 registry->RegisterStringPref(prefs::kLastStartupVersion, std::string()); | 561 registry->RegisterStringPref(prefs::kLastStartupVersion, std::string()); |
| 557 registry->RegisterIntegerPref(prefs::kSameVersionStartupCount, 0); | 562 registry->RegisterIntegerPref(prefs::kSameVersionStartupCount, 0); |
| 558 } | 563 } |
| 559 | 564 |
| 560 bool WasNonBrowserUIDisplayed() { | 565 bool WasMainWindowStartupInterrupted() { |
| 561 return g_non_browser_ui_displayed; | 566 return g_main_window_startup_interrupted; |
| 562 } | 567 } |
| 563 | 568 |
| 564 void SetNonBrowserUIDisplayed() { | 569 void SetNonBrowserUIDisplayed() { |
| 565 g_non_browser_ui_displayed = true; | 570 g_main_window_startup_interrupted = true; |
| 571 } |
| 572 |
| 573 void SetBackgroundModeEnabled() { |
| 574 g_main_window_startup_interrupted = true; |
| 566 } | 575 } |
| 567 | 576 |
| 568 void RecordStartupProcessCreationTime(const base::Time& time) { | 577 void RecordStartupProcessCreationTime(const base::Time& time) { |
| 569 DCHECK(g_process_creation_ticks.Get().is_null()); | 578 DCHECK(g_process_creation_ticks.Get().is_null()); |
| 570 g_process_creation_ticks.Get() = StartupTimeToTimeTicks(time); | 579 g_process_creation_ticks.Get() = StartupTimeToTimeTicks(time); |
| 571 DCHECK(!g_process_creation_ticks.Get().is_null()); | 580 DCHECK(!g_process_creation_ticks.Get().is_null()); |
| 572 } | 581 } |
| 573 | 582 |
| 574 void RecordMainEntryPointTime(const base::Time& time) { | 583 void RecordMainEntryPointTime(const base::Time& time) { |
| 575 DCHECK(g_browser_main_entry_point_ticks.Get().is_null()); | 584 DCHECK(g_browser_main_entry_point_ticks.Get().is_null()); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 UMA_HISTOGRAM_LONG_TIMES, "Startup.LoadTime.ProcessCreateToDllMain2", | 664 UMA_HISTOGRAM_LONG_TIMES, "Startup.LoadTime.ProcessCreateToDllMain2", |
| 656 main_entry_ticks - process_creation_ticks); | 665 main_entry_ticks - process_creation_ticks); |
| 657 } | 666 } |
| 658 } | 667 } |
| 659 | 668 |
| 660 void RecordBrowserWindowDisplay(const base::TimeTicks& ticks) { | 669 void RecordBrowserWindowDisplay(const base::TimeTicks& ticks) { |
| 661 static bool is_first_call = true; | 670 static bool is_first_call = true; |
| 662 if (!is_first_call || ticks.is_null()) | 671 if (!is_first_call || ticks.is_null()) |
| 663 return; | 672 return; |
| 664 is_first_call = false; | 673 is_first_call = false; |
| 665 if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null()) | 674 if (!ShouldLogProcessCreationTicksHistogram()) |
| 666 return; | 675 return; |
| 667 | 676 |
| 668 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( | 677 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( |
| 669 UMA_HISTOGRAM_LONG_TIMES, "Startup.BrowserWindowDisplay", | 678 UMA_HISTOGRAM_LONG_TIMES, "Startup.BrowserWindowDisplay", |
| 670 g_process_creation_ticks.Get(), ticks); | 679 g_process_creation_ticks.Get(), ticks); |
| 671 } | 680 } |
| 672 | 681 |
| 673 void RecordBrowserOpenTabsDelta(const base::TimeDelta& delta) { | 682 void RecordBrowserOpenTabsDelta(const base::TimeDelta& delta) { |
| 674 static bool is_first_call = true; | 683 static bool is_first_call = true; |
| 675 if (!is_first_call) | 684 if (!is_first_call) |
| 676 return; | 685 return; |
| 677 is_first_call = false; | 686 is_first_call = false; |
| 678 | 687 |
| 679 UMA_HISTOGRAM_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( | 688 UMA_HISTOGRAM_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( |
| 680 UMA_HISTOGRAM_LONG_TIMES_100, "Startup.BrowserOpenTabs", delta); | 689 UMA_HISTOGRAM_LONG_TIMES_100, "Startup.BrowserOpenTabs", delta); |
| 681 } | 690 } |
| 682 | 691 |
| 683 void RecordRendererMainEntryTime(const base::TimeTicks& ticks) { | 692 void RecordRendererMainEntryTime(const base::TimeTicks& ticks) { |
| 684 // Record the renderer main entry time, but don't log the UMA metric | 693 // Record the renderer main entry time, but don't log the UMA metric |
| 685 // immediately because the startup temperature is not known yet. | 694 // immediately because the startup temperature is not known yet. |
| 686 if (g_renderer_main_entry_point_ticks.Get().is_null()) | 695 if (g_renderer_main_entry_point_ticks.Get().is_null()) |
| 687 g_renderer_main_entry_point_ticks.Get() = ticks; | 696 g_renderer_main_entry_point_ticks.Get() = ticks; |
| 688 } | 697 } |
| 689 | 698 |
| 690 void RecordFirstWebContentsMainFrameLoad(const base::TimeTicks& ticks) { | 699 void RecordFirstWebContentsMainFrameLoad(const base::TimeTicks& ticks) { |
| 691 static bool is_first_call = true; | 700 static bool is_first_call = true; |
| 692 if (!is_first_call || ticks.is_null()) | 701 if (!is_first_call || ticks.is_null()) |
| 693 return; | 702 return; |
| 694 is_first_call = false; | 703 is_first_call = false; |
| 695 if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null()) | 704 if (!ShouldLogProcessCreationTicksHistogram()) |
| 696 return; | 705 return; |
| 697 | 706 |
| 698 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( | 707 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( |
| 699 UMA_HISTOGRAM_LONG_TIMES_100, "Startup.FirstWebContents.MainFrameLoad2", | 708 UMA_HISTOGRAM_LONG_TIMES_100, "Startup.FirstWebContents.MainFrameLoad2", |
| 700 g_process_creation_ticks.Get(), ticks); | 709 g_process_creation_ticks.Get(), ticks); |
| 701 } | 710 } |
| 702 | 711 |
| 703 void RecordFirstWebContentsNonEmptyPaint(const base::TimeTicks& ticks) { | 712 void RecordFirstWebContentsNonEmptyPaint(const base::TimeTicks& ticks) { |
| 704 static bool is_first_call = true; | 713 static bool is_first_call = true; |
| 705 if (!is_first_call || ticks.is_null()) | 714 if (!is_first_call || ticks.is_null()) |
| 706 return; | 715 return; |
| 707 is_first_call = false; | 716 is_first_call = false; |
| 708 | 717 |
| 709 // Log Startup.BrowserMainToRendererMain now that the first renderer main | 718 // Log Startup.BrowserMainToRendererMain now that the first renderer main |
| 710 // entry time and the startup temperature are known. | 719 // entry time and the startup temperature are known. |
| 711 RecordRendererMainEntryHistogram(); | 720 RecordRendererMainEntryHistogram(); |
| 712 | 721 |
| 713 if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null()) | 722 if (!ShouldLogProcessCreationTicksHistogram()) |
| 714 return; | 723 return; |
| 715 | 724 |
| 716 base::StackSamplingProfiler::SetProcessMilestone( | 725 base::StackSamplingProfiler::SetProcessMilestone( |
| 717 metrics::CallStackProfileMetricsProvider::FIRST_NONEMPTY_PAINT); | 726 metrics::CallStackProfileMetricsProvider::FIRST_NONEMPTY_PAINT); |
| 718 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( | 727 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( |
| 719 UMA_HISTOGRAM_LONG_TIMES_100, "Startup.FirstWebContents.NonEmptyPaint2", | 728 UMA_HISTOGRAM_LONG_TIMES_100, "Startup.FirstWebContents.NonEmptyPaint2", |
| 720 g_process_creation_ticks.Get(), ticks); | 729 g_process_creation_ticks.Get(), ticks); |
| 721 } | 730 } |
| 722 | 731 |
| 723 void RecordFirstWebContentsMainNavigationStart(const base::TimeTicks& ticks, | 732 void RecordFirstWebContentsMainNavigationStart(const base::TimeTicks& ticks, |
| 724 WebContentsWorkload workload) { | 733 WebContentsWorkload workload) { |
| 725 static bool is_first_call = true; | 734 static bool is_first_call = true; |
| 726 if (!is_first_call || ticks.is_null()) | 735 if (!is_first_call || ticks.is_null()) |
| 727 return; | 736 return; |
| 728 is_first_call = false; | 737 is_first_call = false; |
| 729 if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null()) | 738 if (!ShouldLogProcessCreationTicksHistogram()) |
| 730 return; | 739 return; |
| 731 | 740 |
| 732 base::StackSamplingProfiler::SetProcessMilestone( | 741 base::StackSamplingProfiler::SetProcessMilestone( |
| 733 metrics::CallStackProfileMetricsProvider::MAIN_NAVIGATION_START); | 742 metrics::CallStackProfileMetricsProvider::MAIN_NAVIGATION_START); |
| 734 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( | 743 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( |
| 735 UMA_HISTOGRAM_LONG_TIMES_100, | 744 UMA_HISTOGRAM_LONG_TIMES_100, |
| 736 "Startup.FirstWebContents.MainNavigationStart", | 745 "Startup.FirstWebContents.MainNavigationStart", |
| 737 g_process_creation_ticks.Get(), ticks); | 746 g_process_creation_ticks.Get(), ticks); |
| 738 | 747 |
| 739 // Log extra information about this startup's workload. Only added to this | 748 // Log extra information about this startup's workload. Only added to this |
| (...skipping 11 matching lines...) Expand all Loading... |
| 751 ticks - g_process_creation_ticks.Get()); | 760 ticks - g_process_creation_ticks.Get()); |
| 752 } | 761 } |
| 753 } | 762 } |
| 754 | 763 |
| 755 void RecordFirstWebContentsMainNavigationFinished( | 764 void RecordFirstWebContentsMainNavigationFinished( |
| 756 const base::TimeTicks& ticks) { | 765 const base::TimeTicks& ticks) { |
| 757 static bool is_first_call = true; | 766 static bool is_first_call = true; |
| 758 if (!is_first_call || ticks.is_null()) | 767 if (!is_first_call || ticks.is_null()) |
| 759 return; | 768 return; |
| 760 is_first_call = false; | 769 is_first_call = false; |
| 761 if (WasNonBrowserUIDisplayed() || g_process_creation_ticks.Get().is_null()) | 770 if (!ShouldLogProcessCreationTicksHistogram()) |
| 762 return; | 771 return; |
| 763 | 772 |
| 764 base::StackSamplingProfiler::SetProcessMilestone( | 773 base::StackSamplingProfiler::SetProcessMilestone( |
| 765 metrics::CallStackProfileMetricsProvider::MAIN_NAVIGATION_FINISHED); | 774 metrics::CallStackProfileMetricsProvider::MAIN_NAVIGATION_FINISHED); |
| 766 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( | 775 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT( |
| 767 UMA_HISTOGRAM_LONG_TIMES_100, | 776 UMA_HISTOGRAM_LONG_TIMES_100, |
| 768 "Startup.FirstWebContents.MainNavigationFinished", | 777 "Startup.FirstWebContents.MainNavigationFinished", |
| 769 g_process_creation_ticks.Get(), ticks); | 778 g_process_creation_ticks.Get(), ticks); |
| 770 } | 779 } |
| 771 | 780 |
| 781 void RecordBrowserWindowFirstPaint(const base::TimeTicks& ticks) { |
| 782 static bool is_first_call = true; |
| 783 if (!is_first_call || ticks.is_null()) |
| 784 return; |
| 785 is_first_call = false; |
| 786 if (!ShouldLogProcessCreationTicksHistogram()) |
| 787 return; |
| 788 |
| 789 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE( |
| 790 UMA_HISTOGRAM_LONG_TIMES_100, "Startup.BrowserWindow.FirstPaint", |
| 791 g_process_creation_ticks.Get(), ticks); |
| 792 } |
| 793 |
| 794 void RecordBrowserWindowFirstPaintCompositingEnded( |
| 795 const base::TimeTicks& ticks) { |
| 796 static bool is_first_call = true; |
| 797 if (!is_first_call || ticks.is_null()) |
| 798 return; |
| 799 is_first_call = false; |
| 800 if (!ShouldLogProcessCreationTicksHistogram()) |
| 801 return; |
| 802 |
| 803 UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE( |
| 804 UMA_HISTOGRAM_LONG_TIMES_100, |
| 805 "Startup.BrowserWindow.FirstPaint.CompositingEnded", |
| 806 g_process_creation_ticks.Get(), ticks); |
| 807 } |
| 808 |
| 772 base::TimeTicks MainEntryPointTicks() { | 809 base::TimeTicks MainEntryPointTicks() { |
| 773 return g_browser_main_entry_point_ticks.Get(); | 810 return g_browser_main_entry_point_ticks.Get(); |
| 774 } | 811 } |
| 775 | 812 |
| 776 } // namespace startup_metric_utils | 813 } // namespace startup_metric_utils |
| OLD | NEW |