Skip to content

Commit 39245c4

Browse files
committed
perf: optimize XSettings1 startup — remove Before constraint, skip redundant init, clean up debug code
Remove Before=org.dde.session.Daemon1.service so XSettings1 and dde-session-daemon start in parallel. On subsequent boots where scale factor is already persisted in DConfig, skip RandR monitor enumeration, Plymouth scaling, and Greeter Qt theme update (~100-350ms saved). Remove leftover debug code in getXcbAtomProperty that queried atom type names and hex-dumped binary property values on every call. Remove unnecessary isServiceRegistered guard in DSMRegister. Add startup timing logs (qWarning level) for future profiling. 移除对 dde-session-daemon 的 Before 排序约束,使 XSettings1 和 dde-session-daemon 可以并行启动。后续登录时跳过 RandR 枚举、Plymouth 缩放和 Greeter 更新 (节省约 100-350ms)。清理 getXcbAtomProperty 中的调试遗留代码(每次读取属性 都查询原子类型名称并 hex 转储二进制值)。移除 DSMRegister 中不必要的 isServiceRegistered 检查。添加启动计时日志用于性能分析。 Log: perf: optimize XSettings1 startup — remove Before constraint, skip redundant init, clean up debug code Change-Id: I2b5f4e9404bc2af10e077d936698a2b2569d2a8e
1 parent 6cefac6 commit 39245c4

4 files changed

Lines changed: 57 additions & 30 deletions

File tree

src/plugin-qt/xsettings/impl/xsettingsmanager.cpp

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <QDebug>
1212
#include <QDir>
1313
#include <QDirIterator>
14+
#include <QElapsedTimer>
1415
#include <QProcessEnvironment>
1516
#include <QStandardPaths>
1617
#include <QThreadPool>
@@ -29,16 +30,50 @@ XSettingsManager::XSettingsManager(QObject *parent)
2930
, m_sysDaemonInterface(new QDBusInterface("com.deepin.daemon.Daemon", "/com/deepin/daemon/Daemon", "com.deepin.daemon.Daemon", QDBusConnection::systemBus()))
3031
, m_xcbUtils(XcbUtils::getInstance())
3132
{
33+
QElapsedTimer timer;
34+
timer.start();
35+
qWarning() << "[xsettings] ctor start";
36+
3237
connect(m_settingDconfig, &DTK_CORE_NAMESPACE::DConfig::valueChanged, this, &XSettingsManager::handleDConfigChangedCb);
33-
setScreenScaleFactors(getScreenScaleFactors(), false);
34-
adjustScaleFactor(getRecommendedScaleFactor());
35-
setSettings(getSettingsInSchema());
3638

39+
double scale = 0;
40+
if (m_settingDconfig->isValid()) {
41+
scale = m_settingDconfig->value("scale-factor").toDouble();
42+
}
43+
qWarning() << "[xsettings] after scale check" << timer.elapsed() << "ms" << "scale=" << scale;
44+
45+
// scale <= 0 is invalid, use recommended scale factor
46+
if (scale <= 0) {
47+
setScreenScaleFactors(getScreenScaleFactors(), false);
48+
adjustScaleFactor(getRecommendedScaleFactor());
49+
qWarning() << "[xsettings] after first-boot scale init" << timer.elapsed() << "ms";
50+
}
51+
52+
QElapsedTimer stageTimer;
53+
stageTimer.start();
54+
QVector<XsSetting> schemaSettings = getSettingsInSchema();
55+
qWarning() << "[xsettings] getSettingsInSchema" << stageTimer.elapsed() << "ms" << "count=" << schemaSettings.size();
56+
57+
stageTimer.restart();
58+
setSettings(schemaSettings);
59+
qWarning() << "[xsettings] setSettings(schema)" << stageTimer.elapsed() << "ms";
60+
61+
stageTimer.restart();
3762
updateDPI();
63+
qWarning() << "[xsettings] updateDPI" << stageTimer.elapsed() << "ms";
64+
65+
stageTimer.restart();
3866
updateXResources();
67+
qWarning() << "[xsettings] updateXResources" << stageTimer.elapsed() << "ms";
68+
3969
QThreadPool::globalInstance()->start([this]() {
70+
QElapsedTimer firefoxTimer;
71+
firefoxTimer.start();
4072
updateFirefoxDPI();
73+
qWarning() << "[xsettings] updateFirefoxDPI" << firefoxTimer.elapsed() << "ms";
4174
});
75+
76+
qWarning() << "[xsettings] ctor done" << timer.elapsed() << "ms";
4277
}
4378

4479
ArrayOfColor XSettingsManager::getColor(const QString &prop)
@@ -290,7 +325,10 @@ double calcRecommendedScaleFactor(double widthPx, double heightPx, double widthM
290325

291326
double XSettingsManager::getRecommendedScaleFactor()
292327
{
328+
QElapsedTimer t;
329+
t.start();
293330
QList<XcbUtils::MonitorSizeInfo> monitors = XcbUtils::getInstance().getMonitorSizeInfos();
331+
qWarning() << "[xsettings] getMonitorSizeInfos" << t.elapsed() << "ms" << "count=" << monitors.size();
294332
if (monitors.isEmpty()) {
295333
return 1.0;
296334
}

src/plugin-qt/xsettings/misc/org.deepin.dde.XSettings1.service

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ CollectMode=inactive-or-failed
77
PartOf=dde-session-pre.target
88
Before=dde-session-pre.target
99

10-
Before=org.dde.session.Daemon1.service
11-
1210
[Service]
1311
Type=dbus
1412
BusName=org.deepin.dde.XSettings1

src/plugin-qt/xsettings/modules/api/xcbutils.cpp

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2025 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: LGPL-3.0-or-later
44
#include "xcbutils.h"
@@ -9,12 +9,17 @@
99
#include <xcb/randr.h>
1010
#include <xcb/xcb.h>
1111

12+
#include <QElapsedTimer>
13+
#include <QLoggingCategory>
14+
1215
#include <stdio.h>
1316
#include <stdlib.h>
1417
#include <unistd.h>
1518

1619
bool xcb_debug = 1;
1720

21+
Q_LOGGING_CATEGORY(xsettingsTimingLog, "dde.xsettings.timing")
22+
1823
XcbUtils &XcbUtils::getInstance()
1924
{
2025
static XcbUtils xcbUtils;
@@ -251,6 +256,8 @@ QList<XcbUtils::MonitorSizeInfo> XcbUtils::getMonitorSizeInfos()
251256
// 获取 _XSETTINGS_SETTINGS 属性
252257
QByteArray XcbUtils::getXcbAtomProperty(xcb_atom_t atom)
253258
{
259+
QElapsedTimer t;
260+
t.start();
254261
bool more = true;
255262
int offset = 0;
256263
xcb_get_property_cookie_t cookie;
@@ -271,34 +278,17 @@ QByteArray XcbUtils::getXcbAtomProperty(xcb_atom_t atom)
271278
reply = xcb_get_property_reply(connection, cookie, &error);
272279
// 在窗口无效时,应当认为此native settings未初始化完成
273280
if (error && error->error_code == 3) {
281+
qCWarning(xsettingsTimingLog) << "getXcbAtomProperty" << t.elapsed() << "ms" << "error=" << error->error_code;
274282
return settings;
275283
}
276284

277-
// 查询这个原子类型的名称
278-
xcb_get_atom_name_cookie_t type_name_cookie = xcb_get_atom_name(connection, reply->type);
279-
xcb_get_atom_name_reply_t *type_name_reply = xcb_get_atom_name_reply(connection, type_name_cookie, NULL);
280-
281-
if (type_name_reply) {
282-
int name_len = xcb_get_atom_name_name_length(type_name_reply);
283-
char *name = xcb_get_atom_name_name(type_name_reply);
284-
qWarning("属性类型名称: %.*s", name_len, name);
285-
free(type_name_reply);
286-
}
287-
void *value = xcb_get_property_value(reply);
288-
int value_len = xcb_get_property_value_length(reply);
289-
qWarning("属性值(字符串): %d |%s\n", value_len, (char *)value);
290-
291285
const auto property_value_length = xcb_get_property_value_length(reply);
292286
settings.append(static_cast<const char *>(xcb_get_property_value(reply)), property_value_length);
293-
QStringList hex;
294-
for (int i = 0; i < property_value_length; ++i) {
295-
hex.append(QString::number((uint8_t)settings[i]));
296-
// hex<<(uint8_t)array.at(i);
297-
}
298287
offset += property_value_length;
299288
more = reply->bytes_after != 0;
300289
free(reply);
301290
}
291+
qCWarning(xsettingsTimingLog) << "getXcbAtomProperty" << t.elapsed() << "ms" << "size=" << settings.size();
302292
return settings;
303293
}
304294

@@ -321,7 +311,10 @@ bool XcbUtils::changeSettingProp(QByteArray data)
321311

322312
void XcbUtils::updateXResources(QVector<QPair<QString, QString>> xresourceInfos)
323313
{
314+
QElapsedTimer t;
315+
t.start();
324316
QString datas = getXResources();
317+
qint64 getMs = t.elapsed();
325318

326319
if (datas.isEmpty()) {
327320
xresourceInfos.push_back(qMakePair(QString("*customization"), QString("-color")));
@@ -343,9 +336,11 @@ void XcbUtils::updateXResources(QVector<QPair<QString, QString>> xresourceInfos)
343336
}
344337
}
345338

339+
qint64 mergeMs = t.elapsed();
346340
datas = XcbUtils::marshalXResources(xresourceInfos);
347341

348342
XcbUtils::setXResources(const_cast<char *>(datas.toStdString().c_str()), datas.length());
343+
qCWarning(xsettingsTimingLog) << "updateXResources get=" << getMs << "ms" << "merge=" << (mergeMs - getMs) << "ms" << "set=" << (t.elapsed() - mergeMs) << "ms" << "total=" << t.elapsed() << "ms";
349344
}
350345

351346
char *XcbUtils::getXResources()

src/plugin-qt/xsettings/plugin.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2025 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: LGPL-3.0-or-later
44

@@ -13,10 +13,6 @@ extern "C" int DSMRegister(const char *name, void *data)
1313
{
1414

1515
auto connection = reinterpret_cast<QDBusConnection *>(data);
16-
if (connection->interface()->isServiceRegistered(name)) {
17-
qWarning() << "DBus service already exists:" << name;
18-
return 1;
19-
}
2016
xSettings = new XSettings1();
2117

2218
QDBusConnection::RegisterOptions opts = QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals | QDBusConnection::ExportAllProperties;

0 commit comments

Comments
 (0)