A slow WordPress website can have many causes. Large images, too many or poorly coded plugins, slow database queries, external services, a lack of caching, WP-Cron, PHP processes, or overloaded hosting resources can affect loading time individually or together.
That is why there is no reliable, one-size-fits-all solution following the pattern „install this one performance plugin and WordPress will be fast.“ Before you optimize, you should find out, which part of the website is actually slow.
For example, a good performance analysis distinguishes between a slow server response, complex WordPress processing, and a frontend that is slowed down in the browser by images, JavaScript, CSS, web fonts, or external services.
Briefly explained: Measure first before you optimize. If the initial server response is already slow, you should investigate PHP, the database, plugins, WordPress processes, and hosting resources. If the HTML page loads quickly, but the browser then takes a long time to render it, the causes are more likely images, CSS, JavaScript, fonts, or external resources.
What does „WordPress is slow“ actually mean? #
The statement can describe very different problems.
Perhaps the public website takes several seconds before anything happens at all. Perhaps the page appears quickly, but images and other elements take a long time to load afterward. In other cases, only the WordPress admin area is slow, or exclusively the WooCommerce checkout responds with a delay.
These situations do not necessarily have the same cause.
Therefore, performance optimization should always begin with as precise a description of the problem as possible.
View frontend and WordPress admin area separately #
A website can be fast on the frontend while having a slow admin area at the same time.
That is entirely possible from a technical standpoint. For example, public pages can be served from a page cache, while requests within:
/wp-admin/
must be dynamically processed by WordPress and PHP.
Therefore, if only the admin area is slow, you shouldn't automatically optimize images on the homepage. Conversely, a slow hero image doesn't necessarily explain a sluggish WordPress editor.
The loading time consists of several sections. #
When calling up a WordPress page, several things happen in simplified terms.
The browser must reach the domain and establish a connection. The web server processes the request. If the page cannot already be delivered from a cache, PHP starts the WordPress application. WordPress loads plugins and themes, among other things, executes database queries, and generates the HTML document.
Only after that does another important part begin in the browser: HTML is processed and additional resources such as stylesheets, JavaScript, images, and fonts are loaded.
A general statement like „the page loads in four seconds“ therefore still does not reveal where this time is being lost.
What is TTFB? #
TTFB stands for Time to First Byte. Simply described, this metric measures how long it takes for the first byte of the server response to arrive at the client after a request.
A high TTFB can be an indication of server-side issues. However, it does not automatically prove that the hosting server is too slow.
Several factors can influence the measured time, including the network, connection establishment, server processing, and, in the case of dynamic WordPress, the required PHP and database processing.
Important: High TTFB and slow visual rendering are not the same thing. A WordPress site can respond quickly on the server side and still appear slow afterward due to large frontend resources.
Page cache fundamentally changes WordPress performance #
Without a page cache, WordPress typically has to execute PHP for a normal page request, load WordPress, process plugins and the theme, perform database queries, and generate HTML from them.
A page cache can temporarily store previously generated HTML and serve it again for appropriate requests.
Because of this, WordPress does not have to run the complete dynamic process again with every anonymous page request.
This can make a significant performance difference, especially on standard content pages.
Not every page may be cached in the same way #
Caching must be used selectively for dynamic websites.
For example, a WooCommerce cart, checkout, or personalized member area cannot simply be treated like a public blog post.
Even registered users require individual content depending on the application.
Therefore, an incorrect cache configuration may be fast, but at the same time it can cause functional errors or incorrect content.
Caching is not a fix for slow code #
Page caching can significantly speed up many public pages. However, it should not be used to completely cover up fundamental issues.
If an uncached WordPress request takes an extremely long time, inefficient plugins, database issues, or external API calls, for example, could be the cause.
These causes can still occur in the admin area, for logged-in users, during checkout, or with uncached requests.
Practical Tip: During a performance analysis, check both a normal cached page load and areas that are dynamically processed, if possible. A fast homepage does not prove that the entire WordPress application runs quickly.
Plugins can slow down WordPress significantly #
The sheer number of installed plugins is not a reliable performance metric.
A website with 30 lean plugins can work faster than a website with five very complex extensions.
The crucial part is, what a plugin actually does during a request.
For example, a plugin can generate many database queries, contact external services, load large amounts of JavaScript, or perform compute-intensive operations on every page load.
„Too many plugins“ is too imprecise as a diagnosis #
Therefore, the recommendation to simply delete as many plugins as possible falls short.
When WordPress is slow, you should identify the extensions that are actually noticeable.
Plugins that significantly change performance after installation or update are particularly interesting.
You should also check for functionally overlapping extensions. Multiple plugins for the same task can not only create unnecessary complexity, but can also sometimes interfere with each other.
We explain how to test extensions against each other in a controlled manner at Identifying and Resolving Plugin or Theme Conflicts in WordPress.
The theme also affects the loading time #
The active theme determines a significant part of the frontend output. It can load stylesheets, JavaScript, fonts, images, and additional functions.
A very comprehensive theme can therefore require more resources than a lightweight theme.
However, that does not mean a minimalist theme automatically makes every WordPress website fast. Page builders, plugins, images, and custom features can still cause the majority of the load.
Therefore, the theme and the rest of the website should be considered together.
Evaluate Page Builders in a differentiated manner #
Page builders enable complex layouts, but they can generate additional HTML, CSS, and JavaScript for this purpose.
Whether this is problematic in practice depends heavily on how the website was built.
Many nested containers, animations, sliders, videos, large background images, and numerous widgets can make a page significantly more complex.
Instead of blindly blaming the page builder, you should investigate which resources and elements are actually being loaded on the specific page.
Images are among the most common frontend bottlenecks #
A high-resolution photo directly from a camera or smartphone can be several megabytes in size. If such an image is used unchanged on a website, the visitor has to transfer this data, even though the image may only be displayed with a width of a few hundred pixels.
This is why images should be appropriately sized and sensibly compressed.
Modern image formats can further reduce the amount of data transferred, provided they match the respective website and browser support.
Image dimensions and file size are not the same #
For example, an image can have dimensions of:
5000 × 3333 Pixel
own, even though on the website it is only listed as:
800 × 533 Pixel
is displayed.
The mere visual reduction via CSS does not automatically reduce the original image file that needs to be transferred.
Therefore, image dimensions should already match their actual use.
Using Lazy Loading effectively #
Images and other resources located far below the initially visible area do not always need to be loaded immediately.
Lazy Loading can load such resources with a delay until they are needed.
This reduces the initial amount of data.
However, an important image in the directly visible area should not be artificially delayed without careful consideration. Performance optimization does not mean fundamentally loading every resource as late as possible.
JavaScript can slow down rendering #
Modern WordPress websites frequently use JavaScript for navigation, sliders, forms, tracking, consent systems, page builders, and many other functions.
Too much or improperly loaded JavaScript can delay browser processing.
Especially on slower mobile devices, it is not just the file size that matters. JavaScript must be downloaded, parsed, and executed.
Therefore, a smaller file can still be expensive if it requires a lot of computational work.
Delay JavaScript – but in a controlled way #
Performance plugins often offer features such as delayed or deferred loading of JavaScript.
This can improve the initial rendering, but must not be enabled blindly.
If dependent scripts are loaded in the wrong order, for example, menus, forms, sliders, or other interactive elements can fail.
Therefore, after such optimizations, you should always test the website's most important functions.
CSS can also become a bottleneck #
Large stylesheets or many different CSS files increase the overhead in the browser.
CSS that is required for the initial rendering but is only available late can be particularly problematic.
However, this also applies here: keeping the number of files as low as possible is not automatically the sole objective. Modern transmission protocols and caching mechanisms are changing the evaluation compared to older optimization rules.
What matters is the actual loading behavior of the website.
Webfonts cost additional requests #
Custom web fonts can improve the design, but they cause additional resource usage.
An especially large number of font families, font weights, and external font services can increase loading time.
Therefore, check which font variants are actually used.
If external font services are used, data protection requirements must be taken into account in addition to performance.
External services can make a fast website slow #
Not every resource of a WordPress site is loaded from its own server.
Typical external components include analysis and tracking services, maps, videos, social media widgets, advertising networks, chat systems, or external fonts.
The performance of these services is partly beyond the control of one's own WordPress server.
If a page responds quickly on the server side, but takes a long time to load in the browser, you should therefore also investigate third-party requests.
Do not underestimate embedded videos #
An embedded video can load additional JavaScript files, preview images, connections, and other resources from an external provider.
This effect can multiply with multiple videos.
Depending on the website, it may make sense to fully load external media only after user interaction.
The WordPress database as a performance factor #
WordPress stores content, settings, and much plugin data in a relational database.
On a page view, WordPress, theme, and plugins execute queries against this database.
The sheer size of the database is not automatically the decisive factor. A large, sensibly structured database can function smoothly, while a smaller database can cause performance problems due to inefficient queries.
Identify slow database queries #
When a dynamic WordPress request is slow, individual database queries can be a significant contributing factor.
Especially plugins with complex search, filter, statistics, or reporting functions can generate demanding queries.
Therefore, a professional analysis should not only ask how large the database is, but which queries actually take a long time and how often they are executed.
wp_options and autoload #
The WordPress options table contains configuration data from WordPress and plugins. Certain options are automatically loaded with many WordPress requests.
If plugins leave very large or unnecessary automatically loaded data there, it can affect performance.
However, such entries should not be randomly deleted from the database based on their name.
Attention: Database „cleanups“ can permanently remove settings or plugin data. Create a backup before manual interventions and only delete data whose function and origin are clearly understood.
Transients and temporary data #
WordPress and plugins can use so-called transients to temporarily cache data.
Transients are fundamentally not an error and are part of the normal WordPress mechanism.
Faulty implementations or unusually large amounts of temporary data can become problematic.
However, the blanket deletion of all transients is not a permanent performance strategy. If they immediately reappear in problematic quantities, the root cause must be investigated.
Audits are not automatically the problem #
WordPress can save previous editing states of posts and pages as revisions.
On websites that have been running for a long time, this can result in a large number of data records.
That doesn't mean, however, that several hundred or thousand revisions are automatically the cause of a slow website.
A database should be optimized based on real measured values rather than generalized assumptions.
Differentiate between Object Cache and Page Cache #
Page cache and object cache solve different tasks.
Simply put, a page cache stores page outputs that have already been generated. A persistent object cache, on the other hand, can cache results and data that WordPress needs during processing beyond individual requests.
Technologies like Redis can be used as a backend for a persistent object cache.
This can be particularly helpful for dynamic WordPress applications with recurring database queries.
However, an object cache does not replace a page cache and does not eliminate poorly programmed code.
WooCommerce has different requirements than a blog #
A simple blog consists predominantly of publicly readable content. Many pages can therefore be cached very effectively.
In contrast, a WooCommerce store features numerous dynamic processes. The shopping cart, checkout, customer account, inventory, prices, and other functions can be user- or state-dependent.
Therefore, performance in WooCommerce must be viewed from a more nuanced perspective.
For example, an excellently cached shop homepage says little about how fast the checkout or a complex product search is processed.
wp-admin slow: check plugins and background processes #
If exclusively the WordPress admin area is slow, you should investigate which processes are taking place there.
Plugins can load dashboard widgets, contact external license servers, calculate statistics, or process data in the background.
Even a large number of administrative AJAX or REST requests can be relevant.
Since the admin area usually cannot be fully cached like a public page, inefficient processes become particularly visible there.
Properly categorizing admin-ajax.php #
WordPress and plugins can the file:
wp-admin/admin-ajax.php
use for AJAX requests.
Many hits to this are not automatically problematic. However, if very frequent or particularly slow AJAX requests occur, it should be checked which function or plugin is triggering them.
The mere blocking of admin-ajax.php is not a sensible general performance solution and can damage website functionality.
Do not disable WordPress REST API across the board #
WordPress and modern plugins use the REST API for numerous functions.
Disabling them completely for performance reasons can affect the block editor or extensions.
When REST requests generate a noticeably high load, the causing application or route should be identified.
WP-Cron can impact performance #
WordPress uses WP-Cron by default to execute scheduled tasks.
Depending on the website, this includes, for example, scheduled posts, maintenance tasks, and background jobs registered by plugins.
With each page view, WordPress can check if scheduled tasks are due.
When there are a very large number of cron jobs or particularly complex ones, this can put a load on the website.
Therefore, what is crucial is not only that WP-Cron exists, but which tasks are executed through it and how long they take.
Replace WP-Cron with a real cron job #
On suitable hosting environments, it can make sense not to trigger the WordPress-internal cron call during normal page requests, but rather to execute it in a controlled manner via a server-side cron job.
For this, WordPress can, for example, be used with:
DISABLE_WP_CRON
be configured accordingly.
However, this should only be done if a reliable external cron job is actually set up afterwards.
Attention: Simply disabling WP-Cron without setting up a replacement can prevent scheduled WordPress and plugin tasks.
PHP version affects WordPress performance #
WordPress is executed primarily server-side using PHP. The PHP version used therefore affects compatibility, security, and performance.
A current PHP version supported by WordPress and the plugins used is generally advisable.
You shouldn't switch PHP versions solely because a higher version number supposedly makes every website faster automatically.
Before a switch, plugins, theme, and custom code must be compatible.
We explain how you proceed under Change PHP version for WordPress and check compatibility.
Differentiate PHP memory limit and performance #
The PHP memory limit determines how much memory a single PHP process or a PHP execution is allowed to use within the respective configuration.
If WordPress reaches this limit, an error such as:
Allowed memory size ... exhausted
occur.
However, a higher memory limit does not automatically make a normally functioning WordPress site faster.
If a plugin consumes an unusual amount of memory, increasing the limit may also merely postpone the symptom.
We explain the differences in detail at PHP Memory Limit in WordPress: Identify and fix errors.
PHP OPcache #
PHP code must be processed for execution. OPcache can cache already compiled PHP bytecode in memory, so PHP files do not need to be completely recompiled with every request.
On modern PHP hosting environments, OPcache is therefore an important component of server-side performance.
As a WordPress user, you normally don't have to make constant changes to this. However, in a technical performance analysis, the PHP runtime environment is part of the big picture.
Hosting resources can become a bottleneck #
Even a technically well-optimized WordPress website requires computing power, memory, database performance, and I/O resources.
If a website permanently requires more resources than its environment can provide, requests may be processed more slowly.
This affects, for example, high-traffic websites, large WooCommerce stores, or websites with resource-intensive plugins.
At CURIAWEB, our WordPress hosting plans a hosting environment designed for WordPress. Nevertheless, in the event of a specific performance problem, it should always be checked first whether, which resource is actually limited, instead of automatically assuming more server performance as a solution.
Properly interpreting CloudLinux resources #
In a CloudLinux hosting environment, the resources of a hosting account can be controlled and limited. This prevents a single account from consuming unlimited resources of the entire server.
If a WordPress website repeatedly hits such limits, this is important diagnostic information.
However, the decisive factor is, which Limit is reached and why.
A sudden, significant increase in resource consumption can be caused by, for example, a problematic plugin, bots, cron jobs, or an unusually high number of dynamic requests. In such a case, a larger hosting package would likely only create more breathing room without eliminating the root cause.
CPU utilization #
PHP code, database operations, and other processes require CPU time.
If a website continuously performs compute-intensive tasks, the CPU can become a bottleneck.
Of particular interest in this regard is whether the high load occurs permanently or only at certain times.
Recurring load peaks can indicate cron jobs, backups, imports, scans, or bots, for example.
I/O and hard drive access #
WordPress reads and writes files and data. Plugins can also cause large amounts of file operations.
Backups, image processing, security scans, imports, and extensive log files are examples of processes that can consume I/O resources.
Fast NVMe storage is helpful, but it cannot completely compensate for inefficient or unnecessarily frequent file operations.
PHP Processes and Concurrent Requests #
For dynamic page requests, PHP must process requests. If a very large number of uncached requests reach the website at the same time, available processes or workers can become a bottleneck.
This is one of the reasons why efficient page caching for publicly cacheable content can be so effective: not every visitor then requires a completely new WordPress execution.
Bots can put a strain on WordPress #
Not every website visit comes from a real visitor.
Search engines, SEO tools, monitoring services, AI crawlers, security scanners, and unwanted bots can also generate requests.
Particularly aggressive bots can request dynamic URLs at a high frequency and thereby overload PHP as well as the database.
Therefore, in the event of unexplained peak loads, it is also worth taking a look at the access logs and the requested URLs.
wp-login.php and automated login attempts #
Publicly accessible WordPress websites frequently receive automated requests at:
wp-login.php
A large number of such requests can consume additional resources.
Appropriate security mechanisms can limit unwanted login attempts. Simply deleting the login file or modifying WordPress core files, on the other hand, is not a solution.
XML-RPC as a potential source of requests #
Depending on the configuration and features used,
xmlrpc.php
Received inquiries.
Whether XML-RPC is required depends on the specific website and the services being used.
Instead of disabling the function across the board based on general performance recommendations, you should first check whether it actually generates relevant load and whether dependent functions exist.
Backups can temporarily require resources #
A complete WordPress backup may need to read many files, create archives, and export database contents.
For large websites, this can cause a noticeable resource load.
For example, if WordPress slows down at a specific time every day, you should check whether backups or other scheduled maintenance tasks are running at that time.
Security scans also require performance #
A security plugin that scans thousands of files inevitably requires resources.
This does not mean that security scans are fundamentally bad. However, their frequency and execution should match the website and hosting environment.
If performance issues always occur during a scan, the temporal correlation is an important clue.
Log files can grow very large unnoticed. #
Faulty plugins or permanently enabled debugging can generate large log files.
An example of a well-known WordPress debug file is:
wp-content/debug.log
If an error is logged multiple times on every page view, this file can grow quickly.
Debugging should therefore be used in a controlled manner for diagnosis and then configured appropriately again.
We explain more about this under Enable WordPress debugging and use error logs.
A slow external API can block WordPress #
Plugins sometimes communicate with external services during a request.
When WordPress waits for the response of a slow or unreachable external server, your own website can respond with delays.
This is especially tricky because your own server can function perfectly from a technical standpoint.
When performance issues occur sporadically, external HTTP requests can therefore also be investigated.
Do not confuse DNS and network with WordPress #
Before the browser even reaches WordPress, the domain must be resolved and a connection to the server must be established.
Problems at this level are not WordPress performance problems in the strict sense.
A comprehensive analysis therefore also considers whether the delay occurs even before the actual server processing.
CDN: useful, but not automatically necessary #
A Content Delivery Network can deliver static resources via geographically distributed systems and, depending on the configuration, perform further optimizations.
This can be especially useful with an internationally distributed audience.
However, a CDN does not fix a slow PHP function, an inefficient database query, or a faulty plugin.
Therefore, if the target audience is primarily regional, it should be evaluated what specific problem a CDN is intended to solve.
Many HTTP requests are not automatically bad #
Older performance guides often focus heavily on reducing the number of individual files as drastically as possible.
The number of requests remains relevant, but should not be viewed in isolation.
File size, prioritization, cacheability, transmission protocol, and processing overhead in the browser also play a role.
A single giant JavaScript file is not automatically better than several sensibly structured smaller resources.
Properly understanding Core Web Vitals #
When it comes to perceived user experience, it's not just seconds until fully loaded that matter.
Modern performance measurements consider, among other things, when the most important visible content appears, how quickly a page responds to interactions, and whether the layout shifts unexpectedly during loading.
Therefore, a website can provide a poor user experience despite having an acceptable overall loading time.
LCP – Largest Contentful Paint #
Simplified, the Largest Contentful Paint considers when a large or important content element is rendered within the viewport.
Often this involves a large image, a headline, or other prominent content.
For example, if the hero image is very large or loaded with unnecessary delay, this can worsen the LCP.
INP – Interaction to Next Paint #
Interaction to Next Paint measures a page's responsiveness to user interactions throughout the visit.
Complex JavaScript can, for example, cause the browser not to be able to respond quickly enough after a click or other interaction.
Therefore, a fast server response alone does not guarantee good interaction performance.
CLS – Cumulative Layout Shift #
Cumulative Layout Shift evaluates unexpected layout shifts.
For example, if an image is initially loaded without reserved space and subsequently shifts the rest of the content downward, this can impair visual stability.
Even subsequently loaded banners, fonts, or other elements can contribute to this.
Differentiate between lab data and real user data #
Performance tools can perform tests under controlled conditions. These so-called lab data are excellently suited for reproducible analyses.
However, real visitors use different devices, browsers, and network connections.
Field data or real user data can therefore show a different picture.
Both perspectives are useful and should not be confused with each other.
A single speed test is not enough #
Performance measurements can fluctuate.
Cache state, network, external services, and background processes influence the result.
That is why you should not make extensive changes to a website based on a single test.
Several measurements under comparable conditions provide a better basis.
Practical Tip: Before major optimizations, document a baseline value. Then, change if possible only one relevant area and measure again. This way you can determine whether a measure actually helped.
Homepage alone is not a sufficient test #
A WordPress website often consists of very different page types.
For a meaningful analysis, you should also look at a normal post, an important landing page, and, in the case of WooCommerce, a product page, for example.
If only a single page is slow, the cause may lie in the structure of that exact page and not in the entire WordPress installation.
Pay special attention to mobile performance #
A website that runs smoothly on a powerful desktop with a fast internet connection can respond significantly slower on an average smartphone.
Large amounts of JavaScript and complex visual effects have a greater impact on weaker devices.
Performance should therefore not be assessed exclusively from one's own office computer.
Why a performance score is not the sole goal #
Tools frequently condense complex measured values into a single score.
Such scores are helpful, but they should not become an end in themselves.
A website should be fast, stable, and easy for real users to operate. A technical change that merely improves a score while breaking an important function is not a successful optimization.
Clean up WordPress regularly – but selectively #
Over time, unused plugins, themes, media, test functions, and old configurations accumulate on many installations.
Not all of this immediately makes the website slow. However, unnecessary components increase complexity and can make maintenance and troubleshooting more difficult.
Extensions that are no longer needed should therefore be cleanly removed after prior inspection.
Updates can solve performance issues #
Current WordPress, plugin, and theme versions do not only contain new features and security fixes. Developers also partly improve performance and compatibility.
Therefore, a permanently outdated installation is not a sensible performance strategy.
Updates on important websites should be managed and executed with a functional backup or recovery strategy.
When a plugin should be replaced #
If an extension permanently requires a disproportionately high amount of resources and no configuration or update solution exists, a replacement may be sensible.
What is crucial here is not which plugin is labeled as the „fastest“ on some best-of list, but rather which features your website actually needs and how the alternative performs in your specific environment.
When more hosting resources make sense #
Optimization does not mean that every website must be operated with minimal resources.
If a technically sound website requires high resources on an ongoing basis due to real traffic or legitimate dynamic processes, more computing power can be the right solution.
Before doing so, however, it should be ruled out that the load is primarily caused by an error, bots, a runaway cron job, or an inefficient extension.
Systematically narrow down performance issues #
Start with the concrete symptom. Is the entire website slow or just one page? Does it affect the frontend, wp-admin or both? Is the server response already slow, or do the delays only occur when loading and processing the frontend resources?
Check afterwards whether the problem occurs permanently or only at certain times. A recurring time pattern can indicate backups, cron jobs, scans, or other scheduled processes.
Next, look at the recent changes. If the website became slow immediately after installing a plugin, an update, or a PHP change, you already have an important clue.
Only after that should you specifically investigate plugins, database queries, external requests, cache, PHP, and hosting resources.
What you definitely should not do with a slow WordPress website #
Do not install five performance plugins at the same time. Multiple systems trying to optimize cache, CSS, JavaScript, and database simultaneously can create new conflicts and make troubleshooting more difficult.
Do not randomly delete database tables or options just because an optimization tool marks them as large. Size alone does not prove a performance problem.
Also, do not change the theme, PHP version, caching system, and multiple plugins all at once. If the website is faster afterward, you won't know which measure actually helped.
And do not automatically increase server resources before you have checked why the existing resources are being exhausted.
Basic rule: Measure first, then narrow down the cause, subsequently optimize in a targeted manner, and measure again afterwards. Performance optimization without benchmark values is often just guesswork.
What information helps CURIAWEB support? #
If a WordPress website at CURIAWEB is unusually slow, a description of the problem that is as precise as possible helps much more than the general statement „WordPress is slow“.
For example, share which URL is affected, whether the problem also occurs in the admin area, and since when you have noticed the change. If the performance is only poor at certain times, the approximate time is also important.
It is also helpful to know whether plugins, themes, WordPress, PHP, or other settings were changed immediately prior.
In the event of noticeable resource values or error messages, we can subsequently check specifically whether, for example, PHP, the database, processes, or account resources are involved.
Do not send passwords unsolicited.
Summary #
A slow WordPress website rarely has only one possible cause. Server response, PHP, database, plugins, theme, cache, images, JavaScript, CSS, external services, and hosting resources affect different parts of the loading time.
Therefore, optimization should not begin with installing just any performance plugin, but with measuring and narrowing down the problem.
If the dynamic server response is already slow, you should investigate PHP processing, database queries, plugins, external API calls, cron jobs, and hosting resources in particular. If the server responds quickly while the page loads slowly in the browser, images, JavaScript, CSS, fonts, and third-party resources come into sharper focus.
Page cache and persistent object cache can significantly relieve WordPress, but they solve different tasks and do not replace a clean application. Furthermore, more server performance is only the right solution if resources are actually lacking and not just an inefficient process generating unnecessary load.
Sustainable WordPress optimization therefore always follows the same principle: Measure, determine the cause, make targeted changes, and measure again.