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 |
| Duplicator | Free | Free version is widely used |
| BackupBuddy | Paid | Paid-only plugin |
| WP Staging Pro | Paid | Pro backup features |
| SafeGuard | Paid | Full feature set |
| All-in-One WP Migration | Free | Uses custom adapter for CLI integration |
| BackWPup | Free | Free is the primary version |
| WPvivid | Free | Free core is the main product |
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.
Before the three measured iterations begin, a single warm-up backup runs on each container. The warm-up result is discarded and never included in rankings.
The warm-up primes PHP opcache, MySQL's InnoDB buffer pool, and the Linux filesystem cache. Without it, the first iteration would be penalized by cold caches, skewing the median.
Every battle tests BOTH backup and restore. A plugin must successfully create a backup AND restore it for the result to count. Plugins that crash during either phase automatically lose the battle (crash-as-loss).
Restore is tested by:
Not all backup plugins back up the same data. Some plugins (like SafeGuard, Duplicator, BackWPup) create full-site backups including WordPress core files and wp-config.php. Others (like All-in-One WP Migration) only back up wp-content and the database — by design, they're migration tools rather than disaster-recovery tools.
Each battle result displays backup scope badges showing exactly what each plugin included. This lets you make informed comparisons: a plugin that's faster because it backs up less isn't necessarily better.
Speed rankings use scope-adjusted times. Plugins that back up less data receive a time penalty before determining the winner. This ensures that backing up less is not free -- a plugin cannot appear faster simply by skipping components.
Penalties per missing scope category:
| Missing Category | Time Penalty |
|---|---|
| Database | +8s |
| Uploads | +6s |
| Plugins | +4s |
| Themes | +3s |
| WP Core | +3s |
| wp-config.php | +1s |
For example, All-in-One WP Migration does not back up WordPress core files or wp-config.php, so its raw time receives a +4s penalty (3s for wp-core + 1s for wp-config) before the speed winner is determined.
Backup Arena scores plugins on whether they actually back up everything WordPress.org's official documentation says they should. We use a tiered penalty system based on what each missing component would cost a real user during recovery.
Penalty table (effective from April 2026):
| Component | Penalty | Why this penalty |
|---|---|---|
| Database | 8 Elo | Without it, you have nothing — content, users, settings all gone |
| Uploads | 6 Elo | Media library cannot be regenerated |
| Plugins | 4 Elo | Plugins are user-installed and cannot all be re-downloaded |
| Themes | 3 Elo | Themes can usually be re-downloaded but custom child themes cannot |
| WordPress core | 3 Elo | Officially recoverable from wordpress.org |
| wp-config.php | 10 Elo | Contains security salts (lost = invalidated sessions), custom defines, multisite topology — none recoverable |
| .htaccess | 4 Elo | Custom security rules and redirects lost; default rules can be regenerated |
| db.php drop-in | 5 Elo | Custom DB drivers (HyperDB, LudicrousDB) — site won't connect without it |
| sunrise.php drop-in | 5 Elo | Multisite domain mapping — routing breaks without it |
| object-cache.php drop-in | 3 Elo | Performance degradation only |
| advanced-cache.php drop-in | 3 Elo | Performance degradation only |
Scoring Update Notice
The new penalties for wp-config.php, .htaccess, and drop-in files apply to battles run after April 2026. Historical battles retain their original scoring — they were not measured for these fields, and we don't retroactively penalize plugins for things we didn't measure.
As new battles complete, the leaderboard will gradually reflect the new penalties. Expect rankings to stabilize within ~30 days as enough new battles accumulate.
If a plugin crashes during backup or restore (out of memory, timeout, PHP fatal error), the other plugin automatically wins that battle. This is fair: a plugin that can't handle a workload should lose to one that can.
Infrastructure failures (Docker issues, network errors) that affect both plugins equally are excluded from rankings entirely.
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 ECC |
| Disk | 150 GB 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.8-php8.2-apache |
| PHP version | 8.2 |
| MySQL image | mysql:8.0 |
| Docker network | --internal (no outbound internet) |
| WP container memory | 1 GB (realistic shared hosting limit) |
| PHP memory_limit | 512 MB |
| MySQL container memory | 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 tls_version=''
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.
Every battle is tested across six hosting profiles that simulate real-world infrastructure constraints. Rather than benchmarking on a single generous server, this reveals how each plugin performs under the resource limits your host actually imposes.
| Profile | PHP Memory | Container RAM | CPUs |
|---|---|---|---|
| Shared | 256 MB | 512 MB | 1 |
| Managed WP | 512 MB | 1 GB | 2 |
| VPS Basic | 512 MB | 2 GB | 2 |
| VPS Standard | 512 MB | 1 GB | Unlimited |
| Dedicated | 1 GB | 4 GB | 4 |
| High Performance | 2 GB | 8 GB | All |
Each hosting profile runs 3 iterations per battle, producing 18 total iterations (6 profiles x 3 iterations). Resource limits are applied via Docker container constraints (CPU quotas, memory caps) so both plugins experience identical conditions.
Leaderboard rankings can be filtered by hosting profile, answering the question: "Which plugin wins on myhosting?" A plugin that dominates on a dedicated server may struggle on shared hosting with 256 MB of PHP memory.
Real websites do not sit idle while a backup runs. During benchmarks, simulated server traffic runs in the background to test how each plugin performs under realistic conditions.
Four types of background load are generated:
Load is applied at four intensity levels:
| Level | Request Rate | Simulates |
|---|---|---|
| None | 0 req/s | Idle server (baseline) |
| Light | 3 req/s | Low-traffic blog or portfolio |
| Medium | 10 req/s | Active business site |
| Heavy | 25 req/s | High-traffic store or news site |
The same load level is applied to both plugin containers in a battle, ensuring fairness. This answers the question: "How does this plugin perform when my site has active traffic?"
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 post types, code snippets plugin, image gallery, ~120 portfolio items with high-res images.
Small business site — page builder, forms, SEO, analytics, security, ~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 — 250 products, 570 orders, customer accounts, payment gateways, shipping integrations. Data generated using the WooCommerce PHP API (not bulk SQL): simple products (60%), variable products with Color/Size variations (30%), and grouped products (10%). Orders created via wc_create_order() with proper HPOS support. Includes coupons, product reviews, categories, and tags.
Large WooCommerce store — 2,000 products, 5,800 orders, subscriptions, product bundles, shipment tracking, multi-currency, advanced tax rules. Data generated using the WooCommerce PHP API (not bulk SQL): simple products (60%), variable products with Color/Size variations (30%), and grouped products (10%). Orders created via wc_create_order() with proper HPOS support. Includes coupons, product reviews, categories, and tags.
Photography/video portfolio — 10,000+ high-res images, multiple image optimizers, gallery plugins, 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 backup scope differences
All-in-One WP Migration backs up the database and the entire wp-content directory (plugins, themes, uploads, mu-plugins) but does not include WordPress core files (wp-admin/, wp-includes/) or wp-config.php — by design, it is a migration tool rather than a disaster-recovery tool. This smaller scope contributes to its faster backup times. Comparison pages show scope badges so you can judge speed differences in context.
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.
In addition to file and database integrity checks, Backup Arena performs automated functional checks after each restore to verify the site actually works:
For WooCommerce profiles, additional checks are performed:
Failed verification is logged but does not automatically disqualify the result. Some plugins legitimately change URLs or rewrite certain options during a restore (e.g., migration-oriented tools), so a verification failure is flagged for transparency rather than treated as a crash.
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.