Problem
Some blueprints are imported during create_app() even though they are not required for desktop startup (SERVER_MODE=False). If we only import essential blueprints on startup and lazy load the other this would definetly result in faster load times.
After tracing the startup flow here is a breakdown of the blureprints and how we should ideally load them:
Modules that should remain eagerly loaded
| Module |
Reason |
misc |
Provides the /misc/ping endpoint that Electron polls while waiting for the backend to start. Without it, the application never gets past the splash screen. |
browser |
Hasindex(), the first page Electron loads after startup. Deferring it only shifts the wait from the splash screen to a blank window. preferences also depends on it. |
Core authenticate |
Required for session and login handling, even in desktop mode. |
Good lazy-loading candidates
| Module |
Load when |
Reason |
Approx. size |
authenticate (kerberos, ldap, mfa, oauth2, webserver) |
Never in desktop mode |
Gate imports in authenticate/registry.py behind config.SERVER_MODE. Desktop runs with SERVER_MODE=False and doesn't use these providers. |
~14 files |
tools |
First tool opens |
Query Tool, Debugger, Backup/Restore, ERD, Import/Export, etc. aren't needed during startup. |
~155 files |
llm |
AI assistant opened |
Depends on pgadmin.tools.user_management, so it would likely move together with tools. |
~32 files |
dashboard |
First server/database opened |
The dashboard isn't shown until after a connection is opened. |
~7 files |
Note: Considering how often tools are used, we can keep the tools blueprint in the early-loading category for a few select tools.
Not worth lazy-loading
These modules are tiny (1–4 files each):
preferences
settings
about
help
redirects
Estimated impact
Potentially removes eager imports for roughly:
tools
llm
- External authentication backends
≈ 190 of ~915 Python files
File count is only a rough proxy and not an estimate of startup improvement.
Validation
Profile import costs:
python -X importtime -c "from pgadmin.tools import blueprint"
python -X importtime -c "from pgadmin.llm import blueprint"
python -X importtime -c "from pgadmin.authenticate.registry import AuthSourceRegistry"
Then compare against overall create_app() startup time.
Proposal
- Gate external auth provider imports behind
config.SERVER_MODE.
- Lazy-load
tools on first use.
- Lazy-load
llm together with tools.
- Optionally lazy-load
dashboard if it can be done cleanly.
I would be happy to start from the authenticate change since it's small and self-contained.
This is not a concrete implementation proposal, but rather a summary of observations from tracing the desktop startup flow and a few areas that might be worth exploring. I have not profiled import times yet but plan to do so shortly, so these suggestions are based on the current startup path and module dependencies rather than measured performance. However, I will shortly run the performance tests and provide details as a follow-up to this issue.
I would also appreciate some guidance on whether these are the right areas to target, or if there is a better approach I'm overlooking.
Thanks
Problem
Some blueprints are imported during
create_app()even though they are not required for desktop startup (SERVER_MODE=False). If we only import essential blueprints on startup and lazy load the other this would definetly result in faster load times.After tracing the startup flow here is a breakdown of the blureprints and how we should ideally load them:
Modules that should remain eagerly loaded
misc/misc/pingendpoint that Electron polls while waiting for the backend to start. Without it, the application never gets past the splash screen.browserindex(), the first page Electron loads after startup. Deferring it only shifts the wait from the splash screen to a blank window.preferencesalso depends on it.authenticateGood lazy-loading candidates
authenticate(kerberos, ldap, mfa, oauth2, webserver)authenticate/registry.pybehindconfig.SERVER_MODE. Desktop runs withSERVER_MODE=Falseand doesn't use these providers.toolsllmpgadmin.tools.user_management, so it would likely move together withtools.dashboardNot worth lazy-loading
These modules are tiny (1–4 files each):
preferencessettingsabouthelpredirectsEstimated impact
Potentially removes eager imports for roughly:
toolsllm≈ 190 of ~915 Python files
Validation
Profile import costs:
Then compare against overall
create_app()startup time.Proposal
config.SERVER_MODE.toolson first use.llmtogether withtools.dashboardif it can be done cleanly.I would be happy to start from the
authenticatechange since it's small and self-contained.This is not a concrete implementation proposal, but rather a summary of observations from tracing the desktop startup flow and a few areas that might be worth exploring. I have not profiled import times yet but plan to do so shortly, so these suggestions are based on the current startup path and module dependencies rather than measured performance. However, I will shortly run the performance tests and provide details as a follow-up to this issue.
I would also appreciate some guidance on whether these are the right areas to target, or if there is a better approach I'm overlooking.
Thanks