Loading methodology...
Loading methodology...
Transparency
Every benchmark on Backup Arena is designed to be reproducible. This page documents the exact hardware, software, site profiles, timing rules, and verification checks so you can audit or replicate any result yourself.
Backup Arena benchmarks the premium/paid version of every plugin. This ensures each plugin is tested at its full capability — not limited by free-tier restrictions.
If a plugin has no paid version (the free version is the only version), we test that. The goal is to evaluate every plugin at its best.
| Plugin | Version Tested | Why |
|---|---|---|
| UpdraftPlus Premium | Paid | Premium features unlock full WP-CLI |
| Duplicator Pro | Paid | Faster engine, more options |
| BackupBuddy | Paid | Paid-only plugin |
| WP Staging Pro | Paid | Pro backup features |
| SafeGuard | Paid | Full feature set |
| All-in-One WP Migration | Free | No paid version with CLI |
| BackWPup | Free | Free is the primary version |
| WPvivid | Free | Free core is the main product |
Note on All-in-One WP Migration: The free version is what most users have, and the premium version does not add CLI support. Testing the free version is the most representative comparison.
Before each backup run, the Worker configures every plugin to maximize scope and normalize compression, creating a level playing field. We never change plugin architecture (single zip vs. multi-zip, streaming vs. batch) -- only settings.
Benchmarks run on a dedicated Hetzner VPS that serves no other traffic. The machine is reserved exclusively for benchmark execution to eliminate noisy-neighbor effects.
| CPU | 8 vCPU (dedicated) |
| RAM | 16 GB DDR4 |
| Disk | NVMe SSD |
| OS | Ubuntu 22.04 LTS |
| Network | Internal only (no public traffic) |
Each battle spins up four fresh containers: two WordPress + two MySQL instances, one pair per plugin. Containers run on an internal Docker network with no outbound internet access.
| WordPress image | wordpress:6.x-php8.2-apache |
| PHP version | 8.2 |
| MySQL image | mysql:8.0 |
| Docker network | --internal (no outbound internet) |
| Container memory limit | 2 GB per MySQL container |
| Container cleanup | Stopped + removed after every battle |
Each MySQL container uses a custom configuration file mounted at /etc/mysql/conf.d/bench.cnf:
[mysqld] innodb_buffer_pool_size = 1G max_allowed_packet = 256M innodb_flush_log_at_trx_commit = 0
Disclosure: innodb_flush_log_at_trx_commit = 0
This is a deliberate deviation from MySQL defaults. It flushes the redo log once per second instead of on every transaction commit, improving write performance. This setting affects DB-heavy benchmark timing. It is applied identically to all plugin containers.
Seven pre-built WordPress sites cover the full spectrum from a fresh install to enterprise-scale. Each profile is a deterministic snapshot loaded identically for every battle.
Minimal WordPress blog — starter theme, 3 plugins (Akismet, Yoast SEO, Contact Form 7), ~50 posts with featured images.
Portfolio site — custom theme, code snippets plugin, image gallery, ~120 portfolio items with high-res images.
Small business site — page builder, forms, SEO, analytics, ~40 pages with media library of marketing assets.
News site — 2,000+ posts with categories/tags, multiple authors, ad integration, caching, image-heavy content.
Mid-size WooCommerce store — 500 products, order history, payment gateways, shipping integrations.
Large WooCommerce store — 5,000+ products, 50K+ orders, subscriptions, booking system, multi-currency, advanced tax rules.
Photography/video portfolio — 10,000+ high-res images, video embeds, CDN integration, large media library.
Each site profile is stored as a snapshot archive containing four components:
wp-content.tar.gz -- compressed uploads, themes, and plugin filesdatabase.sql.gz -- gzipped MySQL dumpmetadata.json -- profile name, file count, DB size, plugin listchecksums.json -- SHA-256 hash for every file in the snapshotBefore each battle, the Worker verifies the snapshot's SHA-256 checksum against the published value. The checksum for every profile is displayed in each battle's environment card and can be independently verified by downloading the snapshot.
Each battle runs three iterations. Before each iteration, both container pairs are reset to the clean snapshot state. Reset time (~10-20 seconds) is NOT included in timing -- the clock starts when the backup/restore command executes.
Each plugin's output is parsed into standard phases using a configurable phase parser:
| Phase | What it measures |
|---|---|
| SCAN | File and database discovery |
| DB_EXPORT | MySQL database dump |
| ARCHIVE | Compression of files into backup archive |
| RESTORE_FILES | Extraction and placement of backup files |
| RESTORE_DB | MySQL database import |
| VERIFY | Post-restore integrity checks |
Plugins whose output cannot be broken into phases receive a single BACKUP / RESTORE bar.
Different backup plugins use different archive formats, which affects both speed and output size:
| Format | Compression | Used by |
|---|---|---|
| ZIP | Yes (deflate) | UpdraftPlus, BackWPup, WPvivid, most plugins |
| TAR.GZ | Yes (gzip) | Duplicator Pro, some CLI-based plugins |
| WPRESS | No (proprietary) | All-in-One WP Migration |
| WPSTG | No (proprietary) | WP Staging |
Compression directly affects the fairness of speed comparisons. A plugin that skips compression will appear faster (less CPU work) but produces a larger archive. Conversely, a plugin that compresses well takes longer but saves storage and bandwidth.
To address this, Backup Arena shows both raw timing AND storage metrics for every battle: archive size with format badge, compression ratio (archive size vs. raw wp-content), and throughput in MB/s. The three-winner system (Speed, Storage, Best Overall) makes these trade-offs explicit -- a plugin that skips compression wins on speed but loses on storage.
Note on "no compression" plugins
Some plugins (notably All-in-One WP Migration free) also exclude plugins and themes from their backup scope, further reducing both time and archive size. The compression ratio shown in results helps identify this: a ratio near 1.0:1 means the archive is essentially the same size as the raw data, indicating no compression was applied.
Not all backup plugins back up the same data. Some include everything (database, plugins, themes, uploads, wp-config.php), while others skip certain categories. This makes speed comparisons unfair if one plugin simply backs up less data.
After each backup completes, Backup Arena inspects the backup output to detect which categories were included. It examines file listings, ZIP/TAR archive contents, and WPRESS file headers, looking for patterns like .sql files (database), plugins/, themes/, uploads/ directories, and wp-config.php.
Results display scope badges (DB, Plugins, Themes, Uploads, wp-config) for each plugin. When the two plugins have different scopes, an amber warning banner appears indicating that results may not be directly comparable. This gives readers the context they need to interpret timing differences fairly.
Each battle determines three winners:
Speed draws do not affect Elo ratings. Best Overall Elo only changes when one plugin Pareto-dominates the other; "Different Strengths" results count as draws with no Elo change.
Every restore is verified with four independent checks. If a plugin produces a corrupted restore, it is caught and shown publicly in the battle results.
File count match
Restored file count is compared against the original snapshot. Any discrepancy is flagged.
Sample checksum (SHA-256)
100 randomly-sampled files are hashed and compared against the original checksums.json. Catches silent corruption.
Database table check
SHOW TABLES count must match. Row counts for posts, postmeta, options, and users are compared against the original.
WordPress integrity
wp_options siteurl matches expected value. wp eval 'echo home_url();' returns the expected URL (WP-CLI check, no web server required).
Result: verified: true/false per plugin per iteration, displayed in every battle result.
Backup Arena offers two execution modes. Users choose the mode when starting a battle, and the mode is displayed on every result page.
Both plugins run simultaneously on the same physical host. While each has dedicated MySQL and filesystem I/O via fully isolated container pairs (bench-wp-a + bench-db-a, bench-wp-b + bench-db-b), they share CPU cores and memory bandwidth.
A plugin's benchmark score may be marginally affected by the concurrent load of its opponent. This mirrors real-world hosting where WordPress shares resources with other processes.
To reduce positional bias, the container pair assignment is randomly swapped per iteration -- plugin A may run on container pair B and vice versa.
Each battle runs three iterations with a median calculation to reduce variance from transient resource contention.
Plugins run one at a time with a 3-second cache-settling pause between operations. The execution order is randomized per iteration (independent coin flip for backup and restore), eliminating cold/warm cache bias.
Sequential mode removes all resource contention between plugins, producing the fairest possible comparison at the cost of roughly doubling the total battle time.
Recommended when you need the highest-confidence results or when comparing plugins with very similar performance where shared-resource noise could affect the outcome.
Benchmark containers are sandboxed to prevent any plugin from affecting the host system or other battles.
--internal network with no outbound internet accessbackup_output_path is validated at three layers: frontend form, API endpoint, and Worker before every docker cp commandAll site profile snapshots are available for download. You can load them into the same Docker setup and run the benchmark scripts yourself to independently verify any result.
# Pull the benchmark containers docker compose -f docker-compose.bench.yml up bench-wp-a bench-db-a # Load a snapshot and run a backup docker exec bench-wp-a wp [plugin] backup ... # Compare your timings against published results
Questions about methodology? Contact us.