Do not keep reparsing plasmarc configuration

KConfig->reparseConfiguration is expensive. It throws away our cached
values.

The Units constructor was calling this every single time. Units is
created a _lot_; once per applet and once per FrameSVGItem.

This meant we were reloading the same config ~100 times on startup for
no reason.

Perf showed this as being ~5% of the total startup time.

-    7.47%     0.00%      plasmashell  libKF5ConfigCore.so.5.5.0
                   [.] KConfig::reparseConfiguration()

   - KConfig::reparseConfiguration()

      + 66.51% Units::settingsFileChanged(QString const&)

      + 25.95% KConfig::KConfig(QString const&,
QFlags<KConfig::OpenFlag>, QStandardPaths::StandardLocation)

      + 3.93% KDesktopFile::KDesktopFile(QString const&)

      + 3.61% Units::settingsFileChanged(QString const&)

Change-Id: Ia70b7001ba473c8063e6c999b8e4233ea5b206f5
This commit is contained in:
David Edmundson 2014-12-11 01:04:57 +01:00
parent aac89104bd
commit 901cc3e159
2 changed files with 20 additions and 12 deletions

View File

@ -1,6 +1,7 @@
/***************************************************************************
* Copyright 2013 Marco Martin <mart@kde.org> *
* Copyright 2014 Sebastian Kügler <sebas@kde.org> *
* Copyright 2014 David Edmundson <davidedmunsdon@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
@ -59,8 +60,8 @@ Units::Units(QObject *parent)
connect(KDirWatch::self(), &KDirWatch::dirty, this, &Units::settingsFileChanged);
// ... but also remove/recreate cycles, like KConfig does it
connect(KDirWatch::self(), &KDirWatch::created, this, &Units::settingsFileChanged);
// Trigger configuration read
settingsFileChanged(plasmarc);
// read configuration
updatePlasmaRCSettings();
}
Units::~Units()
@ -70,18 +71,24 @@ Units::~Units()
void Units::settingsFileChanged(const QString &file)
{
if (file.endsWith(plasmarc)) {
KConfigGroup cfg = KConfigGroup(KSharedConfig::openConfig(plasmarc), groupName);
cfg.config()->reparseConfiguration();
const int longDuration = cfg.readEntry("longDuration", defaultLongDuration);
if (longDuration != m_longDuration) {
m_longDuration = longDuration;
emit durationChanged();
}
KSharedConfigPtr cfg = KSharedConfig::openConfig(plasmarc);
cfg->reparseConfiguration();
updatePlasmaRCSettings();
}
}
void Units::updatePlasmaRCSettings()
{
KConfigGroup cfg = KConfigGroup(KSharedConfig::openConfig(plasmarc), groupName);
const int longDuration = cfg.readEntry("longDuration", defaultLongDuration);
if (longDuration != m_longDuration) {
m_longDuration = longDuration;
emit durationChanged();
}
}
void Units::iconLoaderSettingsChanged()
{
// These are not scaled, we respect the user's setting over dpi scaling

View File

@ -164,11 +164,12 @@ Q_SIGNALS:
private Q_SLOTS:
void iconLoaderSettingsChanged();
void settingsFileChanged(const QString &settings);
void settingsFileChanged(const QString &file);
private:
void updateDevicePixelRatio();
void updateSpacing();
void updatePlasmaRCSettings();
/**
* @return The dpi-adjusted size for a given icon size
*/