Commit bd29fbdd authored by Patrick Monette's avatar Patrick Monette Committed by Commit Bot

[ModuleDatabase] Add some metrics related to the installed programs

These metrics will give us a sense of how expensive the GetProgramsData
operation is on our user's machine.

Bug: 754488
Change-Id: I85d12045fa0de33284f902c844766ece6205071e
Reviewed-on: https://chromium-review.googlesource.com/612504
Commit-Queue: Patrick Monette <pmonette@chromium.org>
Reviewed-by: default avatarAlexei Svitkine (very slow) <asvitkine@chromium.org>
Reviewed-by: default avatarGreg Thompson <grt@chromium.org>
Reviewed-by: default avatarBruce Dawson <brucedawson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#496486}
parent 9e2162b9
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/task_scheduler/post_task.h" #include "base/task_scheduler/post_task.h"
...@@ -86,13 +88,15 @@ bool GetInstalledFilesUsingMsiGuid( ...@@ -86,13 +88,15 @@ bool GetInstalledFilesUsingMsiGuid(
} }
// Checks if the registry key references an installed program in the Apps & // Checks if the registry key references an installed program in the Apps &
// Features settings page. // Features settings page. Also keeps tracks of the memory used by all the
// strings that are added to |programs_data| and adds it to |size_in_bytes|.
void CheckRegistryKeyForInstalledProgram( void CheckRegistryKeyForInstalledProgram(
HKEY hkey, HKEY hkey,
const base::string16& key_path, const base::string16& key_path,
const base::string16& key_name, const base::string16& key_name,
const MsiUtil& msi_util, const MsiUtil& msi_util,
InstalledPrograms::ProgramsData* programs_data) { InstalledPrograms::ProgramsData* programs_data,
int* size_in_bytes) {
base::win::RegKey candidate( base::win::RegKey candidate(
hkey, hkey,
base::StringPrintf(L"%ls\\%ls", key_path.c_str(), key_name.c_str()) base::StringPrintf(L"%ls\\%ls", key_path.c_str(), key_name.c_str())
...@@ -127,20 +131,30 @@ void CheckRegistryKeyForInstalledProgram( ...@@ -127,20 +131,30 @@ void CheckRegistryKeyForInstalledProgram(
base::FilePath install_path; base::FilePath install_path;
if (GetInstallPathUsingInstallLocation(candidate, &install_path)) { if (GetInstallPathUsingInstallLocation(candidate, &install_path)) {
*size_in_bytes +=
display_name.length() * sizeof(base::string16::value_type);
programs_data->program_names.push_back(std::move(display_name)); programs_data->program_names.push_back(std::move(display_name));
*size_in_bytes +=
install_path.value().length() * sizeof(base::FilePath::CharType);
const size_t program_name_index = programs_data->program_names.size() - 1; const size_t program_name_index = programs_data->program_names.size() - 1;
programs_data->install_directories.push_back( programs_data->install_directories.emplace_back(std::move(install_path),
std::make_pair(std::move(install_path), program_name_index)); program_name_index);
return; return;
} }
std::vector<base::FilePath> installed_files; std::vector<base::FilePath> installed_files;
if (GetInstalledFilesUsingMsiGuid(key_name, msi_util, &installed_files)) { if (GetInstalledFilesUsingMsiGuid(key_name, msi_util, &installed_files)) {
*size_in_bytes +=
display_name.length() * sizeof(base::string16::value_type);
programs_data->program_names.push_back(std::move(display_name)); programs_data->program_names.push_back(std::move(display_name));
const size_t program_name_index = programs_data->program_names.size() - 1; const size_t program_name_index = programs_data->program_names.size() - 1;
for (auto& installed_file : installed_files) { for (auto& installed_file : installed_files) {
programs_data->installed_files.push_back( *size_in_bytes +=
std::make_pair(std::move(installed_file), program_name_index)); installed_file.value().length() * sizeof(base::FilePath::CharType);
programs_data->installed_files.emplace_back(std::move(installed_file),
program_name_index);
} }
} }
} }
...@@ -158,6 +172,8 @@ void SortByFilePaths( ...@@ -158,6 +172,8 @@ void SortByFilePaths(
// Populates and returns a ProgramsData instance. // Populates and returns a ProgramsData instance.
std::unique_ptr<InstalledPrograms::ProgramsData> GetProgramsData( std::unique_ptr<InstalledPrograms::ProgramsData> GetProgramsData(
std::unique_ptr<MsiUtil> msi_util) { std::unique_ptr<MsiUtil> msi_util) {
SCOPED_UMA_HISTOGRAM_TIMER("ThirdPartyModules.InstalledPrograms.GetDataTime");
auto programs_data = base::MakeUnique<InstalledPrograms::ProgramsData>(); auto programs_data = base::MakeUnique<InstalledPrograms::ProgramsData>();
// Iterate over all the variants of the uninstall registry key. // Iterate over all the variants of the uninstall registry key.
...@@ -166,12 +182,14 @@ std::unique_ptr<InstalledPrograms::ProgramsData> GetProgramsData( ...@@ -166,12 +182,14 @@ std::unique_ptr<InstalledPrograms::ProgramsData> GetProgramsData(
L"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall", L"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
}; };
int size_in_bytes = 0;
for (const wchar_t* uninstall_key_path : kUninstallKeyPaths) { for (const wchar_t* uninstall_key_path : kUninstallKeyPaths) {
for (HKEY hkey : {HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER}) { for (HKEY hkey : {HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER}) {
for (base::win::RegistryKeyIterator i(hkey, uninstall_key_path); for (base::win::RegistryKeyIterator i(hkey, uninstall_key_path);
i.Valid(); ++i) { i.Valid(); ++i) {
CheckRegistryKeyForInstalledProgram(hkey, uninstall_key_path, i.Name(), CheckRegistryKeyForInstalledProgram(hkey, uninstall_key_path, i.Name(),
*msi_util, programs_data.get()); *msi_util, programs_data.get(),
&size_in_bytes);
} }
} }
} }
...@@ -181,6 +199,20 @@ std::unique_ptr<InstalledPrograms::ProgramsData> GetProgramsData( ...@@ -181,6 +199,20 @@ std::unique_ptr<InstalledPrograms::ProgramsData> GetProgramsData(
SortByFilePaths(&programs_data->installed_files); SortByFilePaths(&programs_data->installed_files);
SortByFilePaths(&programs_data->install_directories); SortByFilePaths(&programs_data->install_directories);
// Calculate the size taken by |programs_data|.
size_in_bytes +=
programs_data->program_names.capacity() * sizeof(base::string16);
size_in_bytes += programs_data->installed_files.capacity() *
sizeof(std::pair<base::FilePath, size_t>);
size_in_bytes += programs_data->install_directories.capacity() *
sizeof(std::pair<base::FilePath, size_t>);
// Using the function version of this UMA histogram because this will only be
// invoked once during a browser run so the caching that comes with the macro
// version is wasted resources.
base::UmaHistogramMemoryKB("ThirdPartyModules.InstalledPrograms.DataSize",
size_in_bytes / 1024);
return programs_data; return programs_data;
} }
......
...@@ -81958,6 +81958,22 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries. ...@@ -81958,6 +81958,22 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary> </summary>
</histogram> </histogram>
<histogram name="ThirdPartyModules.InstalledPrograms.DataSize" units="KB">
<owner>pmonette@chromium.org</owner>
<summary>
Records the size of the in-memory representation of the installed
third-party programs on the user's machine.
</summary>
</histogram>
<histogram name="ThirdPartyModules.InstalledPrograms.GetDataTime" units="ms">
<owner>pmonette@chromium.org</owner>
<summary>
Records the time it took to gather the list of installed third-party
programs and their install location or components.
</summary>
</histogram>
<histogram name="ThirdPartyModules.Modules.Loaded" units="modules"> <histogram name="ThirdPartyModules.Modules.Loaded" units="modules">
<owner>chrisha@chromium.org</owner> <owner>chrisha@chromium.org</owner>
<summary> <summary>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment