{"id":396597,"date":"2026-11-06T09:54:02","date_gmt":"2026-11-06T09:54:02","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/page-speed-benchmark\/"},"modified":"2026-11-06T09:53:50","modified_gmt":"2026-11-06T09:53:50","slug":"mtx-psbench","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/mtx-psbench\/","author":23423368,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Page Speed Benchmark","header_author":"MatrixLab","header_description":"Find the pages over your redline: server time, database queries and outgoing HTTP calls per page, on-demand runs and before\/after snapshots.","assets_banners_color":"1c202e","last_updated":"2026-11-06 09:53:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/mtx-psbench\/","header_author_uri":"https:\/\/matrixlabhq.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":208,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"matrixlab","date":"2026-11-06 09:53:50","revision":3787624}},"upgrade_notice":{"1.0.0":"<p>\ud83c\udf89 Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3787624,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3787624,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3787624,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3787624,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3787624,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3787624,"resolution":"1","location":"assets","locale":"","width":1600,"height":1200},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3787624,"resolution":"2","location":"assets","locale":"","width":1600,"height":1200},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3787624,"resolution":"3","location":"assets","locale":"","width":1600,"height":1200},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3787624,"resolution":"4","location":"assets","locale":"","width":1600,"height":1200},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3787624,"resolution":"5","location":"assets","locale":"","width":1600,"height":1200}},"screenshots":{"1":"Overview: every page against your redline, with where its median time goes","2":"Page detail: the median split into database, outgoing HTTP and PHP time, with the time past the redline striped","3":"The slowest sample's queries, the file that ran each one, repeated queries and outgoing HTTP calls","4":"Runs &amp; snapshots: a benchmark in progress, one bar per load, and before\/after comparison","5":"Settings: drag the redline and see which pages cross it; every change saves on its own"}},"plugin_section":[],"plugin_tags":[153,94,5603,247,794],"plugin_category":[52,54,59],"plugin_contributors":[206226,255023],"plugin_business_model":[],"class_list":["post-396597","plugin","type-plugin","status-publish","hentry","plugin_tags-database","plugin_tags-debug","plugin_tags-monitoring","plugin_tags-performance","plugin_tags-speed","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_category-utilities-and-tools","plugin_contributors-imtiazepu","plugin_contributors-matrixlab","plugin_committers-imtiazepu","plugin_committers-matrixlab"],"banners":{"banner":"https:\/\/ps.w.org\/mtx-psbench\/assets\/banner-772x250.png?rev=3787624","banner_2x":"https:\/\/ps.w.org\/mtx-psbench\/assets\/banner-1544x500.png?rev=3787624","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/mtx-psbench\/assets\/icon.svg?rev=3787624","icon":"https:\/\/ps.w.org\/mtx-psbench\/assets\/icon.svg?rev=3787624","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mtx-psbench\/assets\/screenshot-1.png?rev=3787624","caption":"Overview: every page against your redline, with where its median time goes"},{"src":"https:\/\/ps.w.org\/mtx-psbench\/assets\/screenshot-2.png?rev=3787624","caption":"Page detail: the median split into database, outgoing HTTP and PHP time, with the time past the redline striped"},{"src":"https:\/\/ps.w.org\/mtx-psbench\/assets\/screenshot-3.png?rev=3787624","caption":"The slowest sample's queries, the file that ran each one, repeated queries and outgoing HTTP calls"},{"src":"https:\/\/ps.w.org\/mtx-psbench\/assets\/screenshot-4.png?rev=3787624","caption":"Runs &amp; snapshots: a benchmark in progress, one bar per load, and before\/after comparison"},{"src":"https:\/\/ps.w.org\/mtx-psbench\/assets\/screenshot-5.png?rev=3787624","caption":"Settings: drag the redline and see which pages cross it; every change saves on its own"}],"raw_content":"<!--section=description-->\n<p><strong>Page Speed Benchmark<\/strong> measures how long WordPress takes to build each page on your server, and shows you where that time goes: database queries, outgoing HTTP calls, or PHP and rendering. Set a <strong>redline<\/strong>, a time no page should take longer than, and see at a glance which pages are over it and why.<\/p>\n\n<p>Before you change something, <strong>run a benchmark<\/strong>. Make the change, run again, and <strong>compare the two snapshots<\/strong> page by page. No guessing whether that new plugin, query fix or cache setting actually helped.<\/p>\n\n<p>\ud83c\udd98 <strong><a href=\"https:\/\/wordpress.org\/support\/plugin\/mtx-psbench\/#new-post\">Support<\/a><\/strong><\/p>\n\n\n\n<p>Some slowness happens on your server, before the first byte of the page leaves it: an account page waiting 600 ms on a payment API, or a plugin running the same query 300 times to build an order list. For logged-in users that time is rarely cached.<\/p>\n\n<p>Page Speed Benchmark records it. Every sampled page load keeps its server time, its database queries with the file that ran each one, and every outgoing HTTP call with its time and status. The Overview puts every page against your redline, slowest first, and names what takes the most time on each.<\/p>\n\n<p>Everything runs inside your own WordPress site. Nothing is sent to an outside service.<\/p>\n\n\n\n<h3>\ud83d\ude80 Key Features<\/h3>\n\n<ul>\n<li><strong>Redline at a glance<\/strong>: every page against the time you set, slowest first, with how many pages are over it<\/li>\n<li><strong>Cause first<\/strong>: each page's bar names its biggest cost, such as \"HTTP 820 ms\" or \"DB 590 ms\", and shows how far past the redline it runs<\/li>\n<li><strong>Where the time goes<\/strong>: the median split into database, outgoing HTTP and PHP and rendering<\/li>\n<li><strong>Slowest queries<\/strong>: the ten slowest per page, with the theme or plugin file that ran each one<\/li>\n<li><strong>Repeated queries<\/strong>: spot the N+1 pattern, the same query run over and over on one page<\/li>\n<li><strong>Outgoing HTTP calls<\/strong>: URL, method, status and time of every external request made while building the page<\/li>\n<li><strong>On-demand runs<\/strong>: load the pages you pick a number of times and watch every load finish<\/li>\n<li><strong>Before and after snapshots<\/strong>: compare two runs page by page, with time, queries and SQL time side by side<\/li>\n<li><strong>Real-visit sampling<\/strong>: one in every N requests from logged-in users is measured, 1 in 5 by default<\/li>\n<li><strong>CSV export<\/strong> of the Overview<\/li>\n<li><strong>Settings that save as you change them<\/strong>: drag the redline and see which pages would be marked slow<\/li>\n<li><strong>Nothing added to your front end<\/strong>: the plugin loads only on its own admin screen<\/li>\n<\/ul>\n\n\n\n<h3>\u2699\ufe0f How it works<\/h3>\n\n<ul>\n<li><strong>Sampling<\/strong>: one in every N requests from logged-in users is measured (1 in 5 by default). Visitors who are not logged in are never measured, and unsampled requests do no extra work.<\/li>\n<li><strong>Query timing<\/strong>: for a request it is measuring, the plugin turns on WordPress's <code>SAVEQUERIES<\/code> so each query's time and caller are logged. Other requests are left alone. If your <code>wp-config.php<\/code> sets <code>SAVEQUERIES<\/code> to <code>false<\/code>, the plugin respects it and records query counts only.<\/li>\n<li><strong>Outgoing HTTP<\/strong>: calls made through the WordPress HTTP API while building the page are timed with their URL, method and status.<\/li>\n<li><strong>On-demand runs<\/strong>: pages are loaded from your own site, one at a time, as the administrator who started the run. A background worker carries long runs on, so they work even where WP-Cron is disabled.<\/li>\n<li><strong>Live updates<\/strong>: through the WordPress Heartbeat API, off by default and on by themselves while a run is in progress.<\/li>\n<li><strong>Storage<\/strong>: samples and runs are kept in two database tables of your own site. Nothing is sent to an outside service.<\/li>\n<\/ul>\n\n\n\n<h3>Support<\/h3>\n\n<ul>\n<li>\ud83c\udd98 <strong>Free support<\/strong>: the <a href=\"https:\/\/wordpress.org\/support\/plugin\/mtx-psbench\/#new-post\">WordPress.org support forum<\/a><\/li>\n<\/ul>\n\n<h3>Privacy Policy<\/h3>\n\n<p>Page Speed Benchmark does not send data to any outside service and does not use cookies of its own.<\/p>\n\n<p>When real-visit recording is on, a sampled request from a logged-in user stores the page path, the template file, the user ID and timing measurements in your site's database. These records are deleted automatically after the retention period you set (30 days by default), and all of them are removed when the plugin is deleted if the administrator has switched on \"Delete all data when the plugin is deleted\". The plugin adds suggested wording for this to your site's privacy policy guide under Settings &gt; Privacy.<\/p>\n\n<!--section=installation-->\n<p><strong>\u2b07\ufe0f Option 1: Install from WordPress.org (Recommended)<\/strong><\/p>\n\n<ol>\n<li>\ud83d\udd11 Log into your WordPress admin<\/li>\n<li>\ud83d\udd0d Go to <strong>Plugins &gt; Add New<\/strong> and search for <strong>Page Speed Benchmark<\/strong><\/li>\n<li>\ud83d\uddb1\ufe0f Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong><\/li>\n<\/ol>\n\n<p><strong>\ud83d\udce6 Option 2: Manual Upload<\/strong><\/p>\n\n<ol>\n<li>\u2b07\ufe0f Download the plugin zip from WordPress.org<\/li>\n<li>\ud83d\udcc2 Go to <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong><\/li>\n<li>\ud83d\udce4 Upload the zip file and click <strong>Install Now<\/strong><\/li>\n<li>\u2705 Click <strong>Activate Plugin<\/strong><\/li>\n<\/ol>\n\n<p><strong>\ud83d\ude80 Getting Started<\/strong><\/p>\n\n<ol>\n<li>Go to <strong>Tools &gt; Page Speed Benchmark<\/strong><\/li>\n<li>Open <strong>Settings<\/strong> and drag the <strong>redline<\/strong> to the time no page should take longer than<\/li>\n<li>Browse your site while logged in to collect samples from real visits, or open <strong>Runs &amp; snapshots<\/strong>, pick some pages and start a run to measure them straight away<\/li>\n<li>Back on the <strong>Overview<\/strong>, open any page over the redline to see its slowest queries and outgoing HTTP calls<\/li>\n<li>Make a change, run the same pages again, and compare the two snapshots<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"%E2%9A%A1%20does%20it%20slow%20my%20site%20down%3F\"><h3>\u26a1 Does it slow my site down?<\/h3><\/dt>\n<dd><p>Only the requests it samples do any extra work, and only logged-in users are sampled. For an unsampled request the plugin decides \"not this one\" and stops. Visitors who are not logged in are never measured. You can sample less often, or switch real-visit recording off, under Settings.<\/p><\/dd>\n<dt id=\"%F0%9F%91%A4%20why%20only%20logged-in%20users%3F\"><h3>\ud83d\udc64 Why only logged-in users?<\/h3><\/dt>\n<dd><p>Pages for logged-out visitors are usually served from a page cache, so measuring them says little about how fast WordPress builds them. Logged-in traffic (shop managers, members, customers in their account area) is where slow pages hurt and caches rarely help.<\/p><\/dd>\n<dt id=\"%F0%9F%92%BE%20what%20does%20the%20plugin%20store%2C%20and%20for%20how%20long%3F\"><h3>\ud83d\udcbe What does the plugin store, and for how long?<\/h3><\/dt>\n<dd><p>For each sample: the page path, the template file, the user ID, the response status and the measurements above. Slow samples also keep their slowest queries and HTTP calls. Samples from real visits are deleted after 30 days by default (you can choose 1 to 365). Samples from on-demand runs are kept until you delete the run. Everything is stored in two database tables of your own site.<\/p><\/dd>\n<dt id=\"%F0%9F%97%91%EF%B8%8F%20what%20happens%20to%20my%20data%20if%20i%20uninstall%20the%20plugin%3F\"><h3>\ud83d\uddd1\ufe0f What happens to my data if I uninstall the plugin?<\/h3><\/dt>\n<dd><p>By default your samples, snapshots and settings are preserved, so reinstalling brings everything back. If you want a clean removal, switch on <strong>Delete all data when the plugin is deleted<\/strong> in Settings &gt; Uninstall before you delete the plugin.<\/p><\/dd>\n<dt id=\"%E2%8F%B1%EF%B8%8F%20why%20does%20it%20say%20%22query%20timing%20is%20off%22%3F\"><h3>\u23f1\ufe0f Why does it say \"Query timing is off\"?<\/h3><\/dt>\n<dd><p>To time queries, WordPress needs the <code>SAVEQUERIES<\/code> constant. The plugin switches it on for sampled requests only. If your <code>wp-config.php<\/code> sets <code>SAVEQUERIES<\/code> to <code>false<\/code>, the plugin respects that: query counts are still recorded, but not their times.<\/p><\/dd>\n<dt id=\"%E2%9A%99%EF%B8%8F%20how%20do%20on-demand%20runs%20work%20without%20wp-cron%3F\"><h3>\u2699\ufe0f How do on-demand runs work without WP-Cron?<\/h3><\/dt>\n<dd><p>Many hosts disable WP-Cron, so runs don't use it. Starting a run makes a signed, non-blocking request back to your own site, which processes loads for up to 20 seconds and then hands over to the next request. If a run stops reporting, the next live update restarts it. The worker endpoint accepts only requests signed with your site's secret keys.<\/p><\/dd>\n<dt id=\"%F0%9F%94%91%20are%20my%20pages%20loaded%20as%20a%20logged-in%20user%20during%20a%20run%3F\"><h3>\ud83d\udd11 Are my pages loaded as a logged-in user during a run?<\/h3><\/dt>\n<dd><p>Yes: as the user who started the run, so you measure what that user sees. The plugin creates a short-lived login session for the run's requests and destroys it after each step.<\/p><\/dd>\n<dt id=\"%F0%9F%A7%B1%20does%20it%20work%20with%20page%20caching%20plugins%3F\"><h3>\ud83e\uddf1 Does it work with page caching plugins?<\/h3><\/dt>\n<dd><p>Yes. Runs load pages \"with caches as they are\", so a run measures what your users get. Logged-in requests usually bypass page caches, which is why the numbers reflect how fast WordPress itself is.<\/p><\/dd>\n<dt id=\"%F0%9F%94%92%20does%20it%20send%20data%20anywhere%3F\"><h3>\ud83d\udd12 Does it send data anywhere?<\/h3><\/dt>\n<dd><p>No. The plugin makes no requests to outside services. The only network requests it makes are the run loads to your own site.<\/p><\/dd>\n<dt id=\"%F0%9F%8C%90%20is%20it%20multisite%20compatible%3F\"><h3>\ud83c\udf10 Is it multisite compatible?<\/h3><\/dt>\n<dd><p>It works per site: activate it on each site you want to measure. Each site keeps its own samples and settings.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>\ud83c\udf89 Initial release<\/li>\n<li>\ud83c\udd95 Overview: every page against your redline, slowest first, with a bar that names what takes the most time<\/li>\n<li>\ud83c\udd95 Page detail: the median split into database, outgoing HTTP and PHP time, the slowest queries with the file that ran each one, repeated queries, and every outgoing HTTP call<\/li>\n<li>\ud83c\udd95 Real-visit sampling of server time, database queries, outgoing HTTP calls, memory and HTML size, for logged-in users only<\/li>\n<li>\ud83c\udd95 On-demand runs: load the pages you pick a number of times and watch each load finish<\/li>\n<li>\ud83c\udd95 Snapshots with page-by-page before and after comparison<\/li>\n<li>\ud83c\udd95 Settings save as you change them; drag the redline and see which pages would be marked slow<\/li>\n<li>\ud83c\udd95 CSV export of the Overview<\/li>\n<li>\u2705 Live updates through the WordPress Heartbeat API, off by default and on by themselves while a run is in progress<\/li>\n<li>\u2705 Nothing loaded from a CDN, and nothing added to your front end<\/li>\n<li>\u2705 Suggested text for your privacy policy, under Settings &gt; Privacy<\/li>\n<li>\u2705 Your data is kept when the plugin is deleted, unless you switch on \"Delete all data when the plugin is deleted\"<\/li>\n<\/ul>","raw_excerpt":"Find the pages over your redline. Server time, database queries and outgoing HTTP calls per page, with on-demand runs and before\/after snapshots.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/396597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=396597"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/matrixlab"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=396597"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=396597"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=396597"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=396597"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=396597"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=396597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}