Benchmarks

Storage benchmarks

Measured execution times for OPFS VFS, PGlite OPFS AHP, IndexedDB, and in-memory storage. Results include the workload, configuration, and test environment.

Run on your device →

Desktop and phone benchmarks

Benchmark results

Results from a MacBook Pro with M5 Pro, a Mac Studio with M1 Max, and an iPhone 17 Pro. Values are medians; tables also show the observed minimum and maximum. Macs use five measured runs after an excluded warm-up. The iPhone uses three runs, with no excluded full-workload warm-up recorded and no exact source commit available.

Workload
Devices

Lower is faster. Both OPFS VFS buffer modes persist to disk. The optional memory-only reference does not. These compare complete systems; OS and browser versions differ.

Select a device to show results.

16-case SQL suite

Median · milliseconds · shared scale
Chrome

OPFS VFS · disk buffer

M5 Pro2,026.98
M1 Max3,468.13

OPFS VFS · memory buffer

M5 Pro2,421
M1 Max4,094.75

PGlite OPFS AHP

M5 Pro2,101.34
M1 Max3,744.55

PGlite IndexedDB

M5 Pro2,315.21
M1 Max3,780.04

Memory-only reference

M5 Pro1,884.35
M1 Max3,113.69
Safari

OPFS VFS · disk buffer

M5 Pro1,711.56
M1 Max3,329.1
iPhone2,101.38

OPFS VFS · memory buffer

M5 Pro1,840.02
M1 Max3,549.28
iPhone2,327.72

PGlite OPFS AHP

M5 ProFile-handle issue
M1 MaxFile-handle issue
iPhone2,075.8

PGlite IndexedDB

M5 Pro2,923.02
M1 Max4,867.76
iPhone4,063.26

Memory-only reference

M5 Pro1,525.2
M1 Max2,817.66
iPhone1,960.38
Firefox

OPFS VFS · disk buffer

M5 Pro2,786.28
M1 Max5,154.52

OPFS VFS · memory buffer

M5 Pro3,306.38
M1 Max6,189.52

PGlite OPFS AHP

M5 Pro4,386.72
M1 Max7,477.88

PGlite IndexedDB

M5 Pro2,915.62
M1 Max5,181.7

Memory-only reference

M5 Pro1,933.92
M1 Max3,654.86

Execution times

1st2nd3rd Lowest visible medians within each row.

Badges describe order, not statistical significance. Ranges are observed minimum–maximum, not confidence intervals. On the Studio Firefox SQL suite, VFS disk and IndexedDB are nearly tied and their ranges overlap.

Scroll the table to compare all backends.

16-case SQL suite: median and observed minimum–maximum in milliseconds, five repetitions per Mac cell and three per iPhone cell.
Browser / deviceOPFS VFS · disk bufferOPFS VFS · memory bufferPGlite OPFS AHPPGlite IndexedDBMemory-only reference
ChromeM5 Pro · 5 runs2,026.98 2nd1st2,010.32 – 2,058.472,421 2,387.56 – 2,441.22,101.34 3rd2nd2,086.14 – 2,132.232,315.21 3rd2,276.84 – 2,321.011,884.35 1st1,871.5 – 1,888.29
ChromeM1 Max · 5 runs3,468.13 2nd1st3,450.24 – 3,495.494,094.75 4,028.1 – 4,110.553,744.55 3rd2nd3,707.83 – 3,780.593,780.04 3rd3,663.11 – 3,798.743,113.69 1st3,104.83 – 3,150.21
SafariM5 Pro · 5 runs1,711.56 2nd1st1,694.04 – 1,733.561,840.02 3rd2nd1,819.96 – 1,848.56File-handle issue2,923.02 3rd2,862.16 – 2,925.441,525.2 1st1,508.18 – 1,536.12
SafariM1 Max · 5 runs3,329.1 2nd1st3,309.22 – 3,371.823,549.28 3rd2nd3,539.86 – 3,587.48File-handle issue4,867.76 3rd4,775.94 – 4,905.322,817.66 1st2,785.5 – 2,844.48
SafariiPhone · 3 runs2,101.38 3rd2nd2,027.12 – 2,263.522,327.72 3rd2,327.28 – 2,432.442,075.8 2nd1st2,044.88 – 2,102.344,063.26 3,932.76 – 4,165.981,960.38 1st1,943.4 – 2,650.9
FirefoxM5 Pro · 5 runs2,786.28 2nd1st2,769.72 – 2,805.423,306.38 3rd3,297.64 – 3,375.264,386.72 4,363.3 – 4,435.862,915.62 3rd2nd2,899.62 – 2,941.21,933.92 1st1,932.84 – 1,980.54
FirefoxM1 Max · 5 runs5,154.52 2nd1st5,114.84 – 5,349.886,189.52 3rd6,090.5 – 6,262.027,477.88 7,366.48 – 7,568.245,181.7 3rd2nd5,106.06 – 5,187.423,654.86 1st3,638.54 – 3,677.38

Mac Safari AHP timings are unavailable. Missing results are excluded from rankings.

10,000-row transaction batch

Median · milliseconds · shared scale
Chrome

OPFS VFS · disk buffer

M5 Pro21.52
M1 Max33.84

OPFS VFS · memory buffer

M5 Pro34.26
M1 Max58.34

PGlite OPFS AHP

M5 Pro23.49
M1 Max36.36

PGlite IndexedDB

M5 Pro51.63
M1 Max80.16

Memory-only reference

M5 Pro18.89
M1 Max28.11
Safari

OPFS VFS · disk buffer

M5 Pro16.78
M1 Max27.38
iPhone19.34

OPFS VFS · memory buffer

M5 Pro22.52
M1 Max36.2
iPhone28.72

PGlite OPFS AHP

M5 ProFile-handle issue
M1 MaxFile-handle issue
iPhone21.84

PGlite IndexedDB

M5 Pro129.64
M1 Max184.2
iPhone155.64

Memory-only reference

M5 Pro14.72
M1 Max23.9
iPhone16.08
Firefox

OPFS VFS · disk buffer

M5 Pro23.94
M1 Max37.52

OPFS VFS · memory buffer

M5 Pro40.42
M1 Max70

PGlite OPFS AHP

M5 Pro30.26
M1 Max47.2

PGlite IndexedDB

M5 Pro68.94
M1 Max108.72

Memory-only reference

M5 Pro16.14
M1 Max26.72

Execution times

1st2nd3rd Lowest visible medians within each row.

Badges describe order, not statistical significance. Ranges are observed minimum–maximum, not confidence intervals. On the Studio Firefox SQL suite, VFS disk and IndexedDB are nearly tied and their ranges overlap.

Scroll the table to compare all backends.

10,000-row transaction batch: median and observed minimum–maximum in milliseconds, five repetitions per Mac cell and three per iPhone cell.
Browser / deviceOPFS VFS · disk bufferOPFS VFS · memory bufferPGlite OPFS AHPPGlite IndexedDBMemory-only reference
ChromeM5 Pro · 5 runs21.52 2nd1st21.5 – 22.3134.26 3rd33.44 – 37.9423.49 3rd2nd23.08 – 24.1451.63 51.44 – 54.4618.89 1st17.81 – 19.98
ChromeM1 Max · 5 runs33.84 2nd1st33.69 – 34.0658.34 3rd57.66 – 58.6636.36 3rd2nd34.32 – 36.5480.16 79.92 – 81.628.11 1st26 – 28.53
SafariM5 Pro · 5 runs16.78 2nd1st16.4 – 17.0222.52 3rd2nd22.06 – 23.04File-handle issue129.64 3rd126.16 – 141.4414.72 1st14.7 – 15.56
SafariM1 Max · 5 runs27.38 2nd1st26.74 – 27.9836.2 3rd2nd35.26 – 38.9File-handle issue184.2 3rd177.24 – 192.4623.9 1st23.4 – 24.74
SafariiPhone · 3 runs19.34 2nd1st17.9 – 20.128.72 3rd25.1 – 68.5821.84 3rd2nd19.96 – 22.32155.64 151.04 – 164.1216.08 1st15.36 – 23.24
FirefoxM5 Pro · 5 runs23.94 2nd1st22.84 – 24.2240.42 3rd39.92 – 44.530.26 3rd2nd29.72 – 59.7268.94 68.48 – 69.8416.14 1st15.9 – 17.18
FirefoxM1 Max · 5 runs37.52 2nd1st36.94 – 39.3270 3rd66.42 – 70.8447.2 3rd2nd46.2 – 50.46108.72 107.4 – 109.2626.72 1st25.6 – 26.94

Mac Safari AHP timings are unavailable. Missing results are excluded from rankings.

Environment and detailed timings

Both Macs have 64 GB RAM and ran plugged in with extensions off. The MacBook used High Power mode. Versions differ, so these results do not isolate chip performance.

MacBook Pro · M5 Pro

macOS 26.6.2 · 64 GB RAM

  • Chrome 153.0.8010.48 (Official Build, arm64)
  • Safari 26.6.2 (21624.5.1.11.3)
  • Firefox 156.0.1
Chrome: lifecycle, SQL cases and filesystem phases

Scroll horizontally to see all columns.

16-case SQL suite · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer528.72525.61 – 535.49481.16479.19 – 486.99<0.010.00 – <0.0136.5436.00 – 38.55
OPFS VFS · memory buffer532.71523.35 – 534.34919.94914.89 – 955.52<0.01<0.01 – <0.0150.8949.45 – 52.01
PGlite OPFS AHP532.04526.19 – 537.01661.25644.15 – 665.32<0.01<0.01 – <0.01125.29121.00 – 129.37
PGlite IndexedDB534.60525.22 – 538.83485.63476.42 – 495.698.778.52 – 9.49368.96366.97 – 371.65
PGlite memory · nonpersistent532.39523.28 – 532.75361.39355.55 – 370.01Not applicableNot applicable

Scroll horizontally to see all columns.

10,000-row transaction batch · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer525.68521.49 – 532.00484.92480.82 – 521.79<0.01<0.01 – <0.0144.4636.88 – 45.37
OPFS VFS · memory buffer524.40518.25 – 561.11920.88912.90 – 923.89<0.01<0.01 – 0.0145.3842.96 – 45.96
PGlite OPFS AHP525.78521.97 – 534.50652.55621.95 – 661.24<0.01<0.01 – <0.01109.50109.01 – 111.73
PGlite IndexedDB531.87517.25 – 533.59477.56466.72 – 486.699.899.26 – 14.01117.48110.24 – 119.74
PGlite memory · nonpersistent522.46516.65 – 529.18361.69356.27 – 364.44Not applicableNot applicable

Preparation, close and final cleanup are outside workload timings. Preparation initializes PGlite before the measured instance. The SQL suite drops its tables and checks their absence after reopen; the transaction workload verifies retained rows. Positive values below 0.01 ms display as <0.01; zero means a recorded zero at the browser timer's resolution.

Scroll horizontally to see all columns.

Individual SQL cases (ms) · see methodology for the pinned SQL
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory bufferPGlite OPFS AHPPGlite IndexedDBPGlite memory · nonpersistent
1. 1,000 INSERTs14.3213.04 – 14.4119.5518.28 – 21.1114.9413.95 – 15.3334.4633.44 – 36.9912.6811.43 – 13.13
2. 25,000 INSERTs in a transaction156.11155.06 – 160.14175.92172.95 – 179.13161.11155.44 – 164.75179.84176.89 – 182.77154.17150.43 – 156.02
3. 25,000 INSERTs into an indexed table192.25189.80 – 193.86233.32231.45 – 235.12197.32188.44 – 199.65216.30212.19 – 217.69181.95180.34 – 182.35
4. 100 SELECTs without an index116.09113.46 – 117.37118.43114.28 – 119.36114.11112.07 – 118.47124.17121.29 – 129.70117.64115.39 – 121.63
5. 100 SELECTs with string comparisons272.20268.82 – 274.91275.86265.74 – 277.22271.64267.15 – 273.35281.32276.50 – 291.44275.30273.77 – 281.02
6. Create indexes24.5222.66 – 27.13106.19103.63 – 111.5228.3827.01 – 30.8865.6564.11 – 65.8222.2421.12 – 24.68
7. 5,000 SELECTs with an index117.14116.45 – 118.29106.04104.10 – 107.05120.76119.85 – 123.36114.59113.73 – 116.24104.17103.46 – 105.97
8. 1,000 UPDATEs without an index60.4560.03 – 61.9764.5562.29 – 66.0062.6762.45 – 64.2576.9475.50 – 77.2459.8158.73 – 62.40
9. 25,000 UPDATEs with an index348.68346.11 – 381.55381.92375.09 – 383.71388.19378.81 – 391.19339.34334.75 – 342.19310.17308.49 – 311.14
10. 25,000 text UPDATEs with an index473.69471.49 – 481.44565.15564.19 – 579.76500.63498.45 – 510.61472.00466.63 – 476.19422.81417.97 – 426.00
11. INSERT from SELECT76.9676.16 – 78.11114.06113.36 – 121.7175.9174.34 – 76.0098.9096.66 – 99.8764.2863.93 – 65.01
12. DELETE without an index9.008.54 – 9.6511.2710.76 – 12.018.448.26 – 8.6935.5934.37 – 37.707.797.55 – 8.00
13. DELETE with an index11.6511.52 – 12.1016.9916.83 – 17.3111.6111.22 – 11.7239.1838.78 – 41.4210.5010.32 – 10.86
14. Large INSERT after DELETE72.3572.16 – 73.30136.47134.19 – 147.6974.9374.81 – 78.89110.40108.25 – 114.3864.7263.90 – 66.49
15. DELETE followed by 12,000 INSERTs72.8571.04 – 73.8781.4080.86 – 82.0272.0169.33 – 73.1594.6090.44 – 96.8869.6068.72 – 71.91
16. DROP tables3.473.22 – 3.866.215.05 – 6.345.425.04 – 5.8523.5123.03 – 26.612.021.89 – 2.13

Scroll horizontally to see all columns.

Filesystem lifecycle (ms) · 1,000 files, 1 KiB each
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory buffer
Mount9.868.86 – 11.316.876.38 – 7.85
Create2.632.58 – 2.8511.4411.02 – 16.43
Write10.4710.00 – 11.8010.7210.56 – 10.81
Read7.066.91 – 7.166.276.07 – 6.71
Rename4.404.32 – 4.4916.0615.40 – 16.19
Delete0.990.97 – 1.304.974.69 – 5.13
Flush3.633.35 – 4.3610.099.56 – 10.30
Reopen3.863.75 – 4.004.464.35 – 4.54

Read includes byte verification. Delete removes half the files; reopen times mounting before verification of the 500 survivors. This suite compares the two VFS buffer modes only.

Safari: lifecycle, SQL cases and filesystem phases

Scroll horizontally to see all columns.

16-case SQL suite · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer556.32548.94 – 576.56442.22437.12 – 455.280.000.00 – 0.0038.8636.98 – 39.36
OPFS VFS · memory buffer574.22564.88 – 583.76678.86662.84 – 687.700.020.00 – 0.0245.5444.58 – 48.26
PGlite OPFS AHPFile-handle issueFile-handle issueFile-handle issueFile-handle issue
PGlite IndexedDB564.54555.16 – 577.66564.60549.82 – 571.1856.8254.82 – 57.56512.38501.28 – 519.62
PGlite memory · nonpersistent560.70560.20 – 563.78343.84342.92 – 350.00Not applicableNot applicable

Scroll horizontally to see all columns.

10,000-row transaction batch · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer554.24532.62 – 570.06440.72436.34 – 452.880.020.02 – 0.0238.8234.52 – 40.52
OPFS VFS · memory buffer556.68552.12 – 565.80681.48664.14 – 693.560.000.00 – 0.0249.8448.34 – 52.42
PGlite OPFS AHPFile-handle issueFile-handle issueFile-handle issueFile-handle issue
PGlite IndexedDB553.06544.84 – 562.20565.50556.18 – 585.2830.4229.90 – 40.46186.62184.78 – 193.16
PGlite memory · nonpersistent564.08555.16 – 570.00341.60339.34 – 360.30Not applicableNot applicable

Preparation, close and final cleanup are outside workload timings. Preparation initializes PGlite before the measured instance. The SQL suite drops its tables and checks their absence after reopen; the transaction workload verifies retained rows. Positive values below 0.01 ms display as <0.01; zero means a recorded zero at the browser timer's resolution.

Scroll horizontally to see all columns.

Individual SQL cases (ms) · see methodology for the pinned SQL
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory bufferPGlite OPFS AHPPGlite IndexedDBPGlite memory · nonpersistent
1. 1,000 INSERTs11.2410.56 – 11.4614.5814.26 – 15.14File-handle issue88.3287.94 – 93.9410.109.74 – 10.10
2. 25,000 INSERTs in a transaction127.86125.38 – 128.30136.68135.50 – 138.36File-handle issue204.08200.58 – 208.48123.12122.46 – 124.94
3. 25,000 INSERTs into an indexed table153.84150.62 – 155.50175.08173.80 – 176.00File-handle issue224.32220.00 – 226.80144.68141.22 – 146.26
4. 100 SELECTs without an index89.3688.38 – 92.3690.8487.90 – 94.84File-handle issue122.44121.62 – 123.6689.7887.68 – 92.28
5. 100 SELECTs with string comparisons222.18220.26 – 232.92227.36217.82 – 233.98File-handle issue258.68254.54 – 269.68228.80222.94 – 229.74
6. Create indexes18.8818.60 – 22.1457.6256.98 – 57.98File-handle issue120.86117.82 – 126.3817.9015.36 – 19.92
7. 5,000 SELECTs with an index97.8295.58 – 98.4889.9289.36 – 91.94File-handle issue128.64126.74 – 133.2287.0886.26 – 87.20
8. 1,000 UPDATEs without an index45.9845.40 – 47.3650.3650.06 – 51.00File-handle issue126.68124.32 – 133.4445.6645.08 – 46.50
9. 25,000 UPDATEs with an index313.60308.06 – 317.94286.40281.98 – 290.00File-handle issue343.10340.38 – 354.88249.60247.16 – 253.06
10. 25,000 text UPDATEs with an index433.60427.38 – 443.28418.68414.82 – 426.52File-handle issue473.56458.16 – 481.12349.58342.40 – 356.00
11. INSERT from SELECT58.8858.64 – 60.4287.4886.66 – 87.90File-handle issue166.56163.04 – 167.8053.3252.68 – 55.46
12. DELETE without an index6.926.82 – 7.208.348.16 – 8.52File-handle issue93.0691.46 – 95.926.966.80 – 7.06
13. DELETE with an index9.349.08 – 9.4413.1613.04 – 13.24File-handle issue93.7893.38 – 96.908.988.94 – 9.32
14. Large INSERT after DELETE56.6656.34 – 57.14110.54109.40 – 112.22File-handle issue197.20190.40 – 209.6252.3447.68 – 54.30
15. DELETE followed by 12,000 INSERTs57.5656.88 – 58.9465.9664.18 – 67.50File-handle issue163.36156.08 – 165.8857.7455.74 – 59.50
16. DROP tables2.322.28 – 2.503.063.00 – 3.14File-handle issue99.8892.88 – 101.361.741.60 – 1.84

Scroll horizontally to see all columns.

Filesystem lifecycle (ms) · 1,000 files, 1 KiB each
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory buffer
Mount4.083.94 – 4.223.463.44 – 3.54
Create2.562.34 – 2.927.767.60 – 7.88
Write7.527.32 – 7.868.508.44 – 9.14
Read7.306.80 – 7.525.645.46 – 5.74
Rename4.744.72 – 4.9410.9810.78 – 12.56
Delete1.061.04 – 1.102.722.70 – 3.10
Flush2.142.04 – 2.165.365.34 – 5.78
Reopen3.723.64 – 3.783.743.72 – 3.96

Read includes byte verification. Delete removes half the files; reopen times mounting before verification of the 500 survivors. This suite compares the two VFS buffer modes only.

Firefox: lifecycle, SQL cases and filesystem phases

Scroll horizontally to see all columns.

16-case SQL suite · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer445.18444.70 – 447.80767.22761.62 – 792.140.000.00 – 0.0259.1458.48 – 59.98
OPFS VFS · memory buffer448.54446.68 – 449.641,652.461,643.80 – 1,656.820.000.00 – 0.0273.3272.00 – 74.08
PGlite OPFS AHP444.88442.70 – 450.821,543.081,539.34 – 1,580.380.000.00 – 0.02358.94356.80 – 366.76
PGlite IndexedDB447.98442.42 – 450.68526.58526.52 – 528.684.144.12 – 4.22648.98645.14 – 666.06
PGlite memory · nonpersistent448.10445.96 – 454.04366.94365.20 – 373.78Not applicableNot applicable

Scroll horizontally to see all columns.

10,000-row transaction batch · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer442.58440.72 – 458.00773.68768.86 – 778.720.000.00 – 0.0252.5651.66 – 54.02
OPFS VFS · memory buffer443.20436.68 – 448.821,649.701,640.52 – 1,668.600.000.00 – 0.0270.0469.18 – 72.86
PGlite OPFS AHP438.08436.54 – 448.301,550.601,499.46 – 1,729.500.000.00 – 0.02358.74344.58 – 415.74
PGlite IndexedDB439.48434.00 – 440.68522.50522.00 – 526.483.703.66 – 3.76165.16162.22 – 166.94
PGlite memory · nonpersistent438.74435.86 – 441.20369.12365.38 – 374.38Not applicableNot applicable

Preparation, close and final cleanup are outside workload timings. Preparation initializes PGlite before the measured instance. The SQL suite drops its tables and checks their absence after reopen; the transaction workload verifies retained rows. Positive values below 0.01 ms display as <0.01; zero means a recorded zero at the browser timer's resolution.

Scroll horizontally to see all columns.

Individual SQL cases (ms) · see methodology for the pinned SQL
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory bufferPGlite OPFS AHPPGlite IndexedDBPGlite memory · nonpersistent
1. 1,000 INSERTs10.7610.54 – 10.8212.9212.80 – 13.0813.6413.28 – 13.7455.2254.78 – 56.0610.1010.04 – 10.16
2. 25,000 INSERTs in a transaction187.78185.08 – 188.66225.28221.70 – 226.36193.82192.50 – 194.90231.84231.66 – 232.46176.14173.00 – 178.00
3. 25,000 INSERTs into an indexed table233.52230.46 – 237.46307.14304.36 – 346.18236.50235.88 – 260.80276.38274.58 – 280.96199.84195.92 – 204.90
4. 100 SELECTs without an index96.4296.18 – 96.9495.9895.54 – 96.5498.8498.58 – 99.20101.88101.28 – 105.3696.3694.88 – 96.72
5. 100 SELECTs with string comparisons265.84264.72 – 268.06263.70261.20 – 268.06267.64263.36 – 270.12269.30264.62 – 276.28265.46260.66 – 268.96
6. Create indexes81.2680.92 – 83.34246.78236.44 – 247.8290.2889.94 – 110.68121.56120.22 – 123.6621.4421.06 – 21.84
7. 5,000 SELECTs with an index129.18126.90 – 130.68106.88103.76 – 109.20295.46289.98 – 303.36111.94111.04 – 113.52103.78102.56 – 107.72
8. 1,000 UPDATEs without an index51.1049.82 – 53.7452.5451.98 – 55.3273.5271.56 – 79.7094.1493.68 – 100.4448.8848.52 – 49.98
9. 25,000 UPDATEs with an index555.92544.96 – 572.20485.94483.24 – 492.281,270.921,269.68 – 1,292.76412.82409.40 – 415.04343.80339.46 – 348.52
10. 25,000 text UPDATEs with an index809.06805.94 – 820.38785.20778.44 – 804.761,455.081,448.00 – 1,508.26583.08576.84 – 584.88462.12460.14 – 466.40
11. INSERT from SELECT113.80113.00 – 116.92216.12214.12 – 229.54113.06112.20 – 115.76149.76148.72 – 150.3662.7862.16 – 74.90
12. DELETE without an index7.687.60 – 8.1211.9611.60 – 12.707.947.66 – 8.2860.4059.30 – 61.687.507.42 – 7.86
13. DELETE with an index10.7810.46 – 10.8023.9223.70 – 24.2010.6210.42 – 10.7863.6462.90 – 66.7810.2210.02 – 10.54
14. Large INSERT after DELETE150.14149.18 – 150.64361.28359.14 – 367.92155.32154.78 – 157.38204.84204.24 – 206.6861.0259.54 – 65.06
15. DELETE followed by 12,000 INSERTs77.3475.60 – 80.68104.42103.64 – 106.2677.1275.76 – 79.02126.70126.22 – 127.8669.8869.56 – 71.44
16. DROP tables2.081.98 – 2.184.163.58 – 4.289.169.00 – 9.4250.4450.02 – 52.081.041.04 – 1.16

Scroll horizontally to see all columns.

Filesystem lifecycle (ms) · 1,000 files, 1 KiB each
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory buffer
Mount8.948.78 – 9.066.986.86 – 7.44
Create3.523.42 – 3.6041.0640.76 – 41.68
Write64.4862.78 – 65.2845.9445.00 – 46.60
Read15.1814.50 – 15.223.663.64 – 3.78
Rename5.124.96 – 5.4045.9245.10 – 46.50
Delete0.980.94 – 1.0219.4619.10 – 19.54
Flush2.302.22 – 2.4038.8438.58 – 38.96
Reopen4.884.80 – 5.029.809.42 – 10.06

Read includes byte verification. Delete removes half the files; reopen times mounting before verification of the 500 survivors. This suite compares the two VFS buffer modes only.

Mac Studio · M1 Max

macOS 26.5.2 · 64 GB RAM

  • Chrome 153.0.8010.53
  • Safari 26.5.2 (21624.2.5.11.8)
  • Firefox 156.0.1
Chrome: lifecycle, SQL cases and filesystem phases

Scroll horizontally to see all columns.

16-case SQL suite · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer781.88768.16 – 793.13772.16754.13 – 778.63<0.01<0.01 – 0.0155.0452.30 – 55.45
OPFS VFS · memory buffer777.78765.67 – 789.441,481.371,445.49 – 1,498.91<0.01<0.01 – <0.0176.4975.62 – 81.83
PGlite OPFS AHP782.26769.26 – 790.49983.81973.56 – 1,072.13<0.01<0.01 – 0.01170.83166.93 – 174.87
PGlite IndexedDB774.72773.48 – 779.97713.51702.69 – 719.6314.8014.61 – 16.95551.93550.49 – 556.37
PGlite memory · nonpersistent778.11763.63 – 790.51537.48530.56 – 538.40Not applicableNot applicable

Scroll horizontally to see all columns.

10,000-row transaction batch · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer765.79761.98 – 773.85750.30738.63 – 779.63<0.01<0.01 – 0.0251.8849.57 – 55.56
OPFS VFS · memory buffer765.29756.40 – 778.341,478.631,458.82 – 1,481.01<0.01<0.01 – 0.0165.7761.98 – 66.51
PGlite OPFS AHP773.22765.33 – 783.05988.15971.35 – 1,001.76<0.01<0.01 – 0.01154.42152.88 – 165.20
PGlite IndexedDB767.10758.63 – 790.12732.89707.78 – 736.7316.2415.85 – 17.10180.24178.31 – 183.55
PGlite memory · nonpersistent774.50768.33 – 792.80553.47538.69 – 557.74Not applicableNot applicable

Preparation, close and final cleanup are outside workload timings. Preparation initializes PGlite before the measured instance. The SQL suite drops its tables and checks their absence after reopen; the transaction workload verifies retained rows. Positive values below 0.01 ms display as <0.01; zero means a recorded zero at the browser timer's resolution.

Scroll horizontally to see all columns.

Individual SQL cases (ms) · see methodology for the pinned SQL
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory bufferPGlite OPFS AHPPGlite IndexedDBPGlite memory · nonpersistent
1. 1,000 INSERTs26.1825.20 – 28.1231.1330.27 – 33.6523.5923.36 – 23.8053.3552.72 – 53.5619.2718.64 – 22.71
2. 25,000 INSERTs in a transaction268.70264.24 – 276.64302.87297.43 – 311.56269.18267.11 – 288.11295.95293.35 – 302.29255.97251.03 – 258.06
3. 25,000 INSERTs into an indexed table328.24325.29 – 335.86400.57391.88 – 407.01333.70329.65 – 340.03357.03347.93 – 366.64305.72303.94 – 306.26
4. 100 SELECTs without an index185.67184.90 – 187.32188.08185.99 – 190.14186.74186.50 – 192.50201.37200.48 – 203.11184.75183.33 – 186.90
5. 100 SELECTs with string comparisons453.82451.49 – 455.28453.57452.36 – 454.38451.67450.71 – 455.77468.82467.86 – 470.07452.41449.48 – 453.07
6. Create indexes39.0638.04 – 39.84168.96167.01 – 169.8650.9050.60 – 53.1489.5688.22 – 90.4131.6131.06 – 31.72
7. 5,000 SELECTs with an index207.11204.19 – 208.12189.86186.94 – 190.86225.83225.20 – 227.35192.72190.03 – 198.66175.11172.89 – 181.16
8. 1,000 UPDATEs without an index95.8295.12 – 96.00100.3197.99 – 101.8298.7398.34 – 99.13119.46118.63 – 119.8791.5991.44 – 91.76
9. 25,000 UPDATEs with an index642.26632.57 – 656.59686.69672.34 – 687.62762.37750.88 – 763.85606.03558.14 – 610.79555.06547.74 – 568.64
10. 25,000 text UPDATEs with an index827.07822.27 – 836.36966.85954.67 – 975.71928.73922.85 – 940.57784.12734.61 – 793.05710.18705.59 – 729.07
11. INSERT from SELECT122.30116.95 – 125.35186.06185.06 – 201.17117.33115.49 – 134.44145.93141.57 – 147.5196.9194.90 – 97.79
12. DELETE without an index14.3514.02 – 14.8018.9618.14 – 20.4013.2013.07 – 13.5453.2152.66 – 56.8412.4112.02 – 12.51
13. DELETE with an index17.2917.02 – 17.3925.1323.96 – 25.3716.5116.02 – 17.0056.8456.53 – 57.3914.8814.66 – 15.08
14. Large INSERT after DELETE118.50116.10 – 119.55219.85214.76 – 229.02126.62124.20 – 127.63161.39160.93 – 164.5595.2292.97 – 95.77
15. DELETE followed by 12,000 INSERTs119.57117.25 – 120.50138.64132.03 – 141.25120.00118.81 – 121.22150.91149.11 – 153.47114.56112.93 – 115.21
16. DROP tables5.685.22 – 6.2610.858.44 – 12.738.577.76 – 19.6636.2735.54 – 37.213.142.87 – 3.40

Scroll horizontally to see all columns.

Filesystem lifecycle (ms) · 1,000 files, 1 KiB each
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory buffer
Mount12.8912.11 – 13.9110.409.82 – 12.45
Create4.174.01 – 4.2822.6022.08 – 23.32
Write21.3220.92 – 22.6420.5119.59 – 21.90
Read12.3812.16 – 12.5410.9210.00 – 11.31
Rename7.216.73 – 7.3831.7731.25 – 34.16
Delete1.491.43 – 1.6710.3710.27 – 10.85
Flush6.506.13 – 7.0820.5119.31 – 20.83
Reopen4.884.63 – 5.256.665.86 – 6.68

Read includes byte verification. Delete removes half the files; reopen times mounting before verification of the 500 survivors. This suite compares the two VFS buffer modes only.

Safari: lifecycle, SQL cases and filesystem phases

Scroll horizontally to see all columns.

16-case SQL suite · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer863.62858.00 – 878.14757.80754.60 – 846.620.020.00 – 0.0261.6458.60 – 63.00
OPFS VFS · memory buffer888.38858.46 – 907.521,181.421,176.76 – 1,380.940.020.00 – 0.0477.0074.14 – 83.02
PGlite OPFS AHPFile-handle issueFile-handle issueFile-handle issueFile-handle issue
PGlite IndexedDB880.60865.54 – 896.38908.56896.02 – 925.9280.4678.52 – 85.60770.16767.38 – 791.80
PGlite memory · nonpersistent870.30856.96 – 879.56546.28544.28 – 549.90Not applicableNot applicable

Scroll horizontally to see all columns.

10,000-row transaction batch · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer856.14849.58 – 868.84756.32749.60 – 761.420.020.00 – 0.0257.3254.50 – 65.50
OPFS VFS · memory buffer858.72849.36 – 867.181,194.501,167.52 – 1,243.780.020.00 – 0.0274.6866.40 – 78.86
PGlite OPFS AHPFile-handle issueFile-handle issueFile-handle issueFile-handle issue
PGlite IndexedDB870.58845.22 – 902.08906.00901.80 – 955.8442.8641.58 – 44.08262.62253.84 – 290.42
PGlite memory · nonpersistent867.28851.72 – 872.28550.54543.10 – 560.38Not applicableNot applicable

Preparation, close and final cleanup are outside workload timings. Preparation initializes PGlite before the measured instance. The SQL suite drops its tables and checks their absence after reopen; the transaction workload verifies retained rows. Positive values below 0.01 ms display as <0.01; zero means a recorded zero at the browser timer's resolution.

Scroll horizontally to see all columns.

Individual SQL cases (ms) · see methodology for the pinned SQL
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory bufferPGlite OPFS AHPPGlite IndexedDBPGlite memory · nonpersistent
1. 1,000 INSERTs22.3420.52 – 23.5624.8023.86 – 26.54File-handle issue132.10129.76 – 136.2026.0025.80 – 26.92
2. 25,000 INSERTs in a transaction242.80236.50 – 245.88261.10259.66 – 273.66File-handle issue335.44327.94 – 340.26233.62227.82 – 237.98
3. 25,000 INSERTs into an indexed table302.16298.82 – 307.36343.42340.06 – 374.50File-handle issue396.20392.52 – 405.52285.34281.98 – 286.54
4. 100 SELECTs without an index150.98149.74 – 155.66156.10150.44 – 161.66File-handle issue199.24196.96 – 201.32150.18149.52 – 154.98
5. 100 SELECTs with string comparisons367.42363.84 – 377.58365.92363.46 – 369.00File-handle issue416.30409.60 – 419.44365.92362.32 – 370.92
6. Create indexes29.6028.92 – 29.96102.8096.74 – 154.20File-handle issue188.50180.76 – 191.5431.5431.06 – 32.04
7. 5,000 SELECTs with an index195.14191.20 – 196.52178.24177.94 – 184.00File-handle issue228.58224.20 – 230.20175.18170.62 – 176.96
8. 1,000 UPDATEs without an index83.4277.80 – 86.0280.6477.46 – 81.20File-handle issue193.12187.54 – 196.9080.4678.40 – 82.66
9. 25,000 UPDATEs with an index676.60665.62 – 691.64636.68617.00 – 643.00File-handle issue648.74641.74 – 680.46507.98494.52 – 518.86
10. 25,000 text UPDATEs with an index908.52907.96 – 921.98883.60864.30 – 886.74File-handle issue878.98851.60 – 901.16669.70651.16 – 686.00
11. INSERT from SELECT105.46104.78 – 108.14155.04151.96 – 158.68File-handle issue252.18246.46 – 254.1685.2084.02 – 89.76
12. DELETE without an index11.2011.02 – 11.2213.2413.06 – 13.56File-handle issue143.68137.96 – 148.3610.5410.38 – 10.62
13. DELETE with an index14.4614.32 – 14.6220.7220.16 – 20.86File-handle issue144.44138.46 – 147.7413.0812.96 – 13.98
14. Large INSERT after DELETE104.80100.04 – 113.14193.74192.36 – 215.00File-handle issue299.36295.02 – 304.1278.4877.24 – 80.32
15. DELETE followed by 12,000 INSERTs108.14107.38 – 110.88120.90118.44 – 121.54File-handle issue253.32248.20 – 256.24100.3499.00 – 101.84
16. DROP tables4.204.04 – 4.805.145.02 – 5.24File-handle issue145.42142.66 – 147.422.782.56 – 3.06

Scroll horizontally to see all columns.

Filesystem lifecycle (ms) · 1,000 files, 1 KiB each
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory buffer
Mount7.207.04 – 14.705.885.72 – 9.34
Create4.003.96 – 4.4016.2815.20 – 23.46
Write14.3414.26 – 15.6615.2414.46 – 16.06
Read10.9410.50 – 11.188.187.92 – 9.22
Rename7.747.48 – 8.8221.8221.04 – 22.68
Delete1.941.86 – 2.146.125.80 – 6.34
Flush3.603.52 – 3.8810.4810.32 – 11.20
Reopen6.165.04 – 6.446.345.50 – 7.40

Read includes byte verification. Delete removes half the files; reopen times mounting before verification of the 500 survivors. This suite compares the two VFS buffer modes only.

Firefox: lifecycle, SQL cases and filesystem phases

Scroll horizontally to see all columns.

16-case SQL suite · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer706.58696.92 – 709.021,209.861,184.18 – 1,290.980.020.00 – 0.0269.5867.98 – 72.52
OPFS VFS · memory buffer710.14699.70 – 748.642,748.802,736.84 – 2,887.220.020.00 – 0.02107.08105.42 – 149.88
PGlite OPFS AHP709.92707.04 – 729.022,460.422,456.38 – 2,487.460.020.02 – 0.04597.60577.04 – 739.10
PGlite IndexedDB706.52705.22 – 715.22835.68812.74 – 873.348.007.58 – 8.701,011.561,007.36 – 1,019.04
PGlite memory · nonpersistent702.58689.70 – 705.04587.76569.56 – 590.52Not applicableNot applicable

Scroll horizontally to see all columns.

10,000-row transaction batch · lifecycle (ms)
Backend / phasePreparationInitializationLater explicit syncReopen
OPFS VFS · disk buffer686.50675.00 – 693.861,209.641,201.04 – 1,218.420.020.00 – 0.0280.8880.18 – 83.36
OPFS VFS · memory buffer686.36677.42 – 693.302,746.782,639.98 – 2,754.040.020.00 – 0.0299.8893.84 – 101.90
PGlite OPFS AHP692.38672.08 – 693.702,471.042,466.32 – 2,550.860.020.02 – 0.02575.10556.84 – 589.86
PGlite IndexedDB689.68685.06 – 693.04831.62822.24 – 840.747.146.92 – 7.28258.78253.48 – 260.40
PGlite memory · nonpersistent689.16681.06 – 695.42582.64566.42 – 592.34Not applicableNot applicable

Preparation, close and final cleanup are outside workload timings. Preparation initializes PGlite before the measured instance. The SQL suite drops its tables and checks their absence after reopen; the transaction workload verifies retained rows. Positive values below 0.01 ms display as <0.01; zero means a recorded zero at the browser timer's resolution.

Scroll horizontally to see all columns.

Individual SQL cases (ms) · see methodology for the pinned SQL
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory bufferPGlite OPFS AHPPGlite IndexedDBPGlite memory · nonpersistent
1. 1,000 INSERTs19.8219.38 – 20.4624.4023.88 – 24.9623.9823.76 – 24.5089.6888.18 – 90.2418.6617.22 – 18.84
2. 25,000 INSERTs in a transaction354.58344.96 – 358.40439.54433.76 – 447.26360.30356.76 – 365.72416.92407.74 – 431.12332.34324.78 – 335.44
3. 25,000 INSERTs into an indexed table455.14451.30 – 462.74620.58597.04 – 646.36459.12451.34 – 466.88503.86495.24 – 506.76391.82382.50 – 399.14
4. 100 SELECTs without an index164.94164.44 – 165.88166.64165.66 – 170.30167.48166.76 – 168.80174.50171.16 – 175.18164.68164.34 – 165.06
5. 100 SELECTs with string comparisons425.32423.62 – 456.54445.28436.28 – 447.76428.26424.70 – 431.48433.46425.40 – 435.74425.66424.00 – 426.14
6. Create indexes119.32119.10 – 121.24388.92380.34 – 393.80135.44132.00 – 143.56194.66192.90 – 201.8230.3230.12 – 30.68
7. 5,000 SELECTs with an index253.04252.78 – 254.02210.14208.14 – 215.24500.66494.20 – 513.68207.12205.30 – 210.20203.46202.76 – 206.92
8. 1,000 UPDATEs without an index89.1088.82 – 91.6093.2491.52 – 96.82124.62122.98 – 126.62156.64155.00 – 159.0885.0884.24 – 87.64
9. 25,000 UPDATEs with an index1,176.921,146.22 – 1,246.741,023.881,018.00 – 1,081.902,198.482,152.66 – 2,212.46825.84802.68 – 832.66728.50718.02 – 738.00
10. 25,000 text UPDATEs with an index1,503.661,489.50 – 1,569.401,514.621,499.74 – 1,518.662,482.362,361.96 – 2,503.161,114.561,093.82 – 1,154.54902.38890.86 – 905.84
11. INSERT from SELECT181.04178.78 – 181.88370.02366.10 – 373.52184.64175.84 – 200.88238.20231.16 – 241.84101.86101.68 – 102.50
12. DELETE without an index12.8012.50 – 12.9819.4819.26 – 19.9812.4611.80 – 12.6294.8894.50 – 96.4411.8011.52 – 11.92
13. DELETE with an index16.7216.46 – 16.8839.7639.38 – 40.5016.9016.28 – 17.04100.4299.26 – 103.5615.4815.00 – 15.54
14. Large INSERT after DELETE234.94229.70 – 235.12605.82599.20 – 635.80241.84236.90 – 258.76304.78300.86 – 312.8896.1095.78 – 99.30
15. DELETE followed by 12,000 INSERTs155.10151.34 – 157.40203.98201.56 – 204.42154.52151.62 – 155.64228.46226.38 – 247.84149.20137.06 – 153.72
16. DROP tables5.024.90 – 5.306.666.10 – 7.2215.2614.72 – 15.4078.0877.56 – 78.322.542.36 – 3.04

Scroll horizontally to see all columns.

Filesystem lifecycle (ms) · 1,000 files, 1 KiB each
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory buffer
Mount13.5813.16 – 14.4212.0611.16 – 13.48
Create5.405.28 – 5.8057.5857.24 – 60.30
Write90.6490.14 – 119.6466.6466.20 – 68.44
Read18.9218.28 – 19.626.686.66 – 6.98
Rename8.668.24 – 8.9267.6465.50 – 67.90
Delete1.821.56 – 1.8427.8627.22 – 28.28
Flush4.243.62 – 4.3451.8650.52 – 53.56
Reopen7.447.08 – 8.1813.2212.80 – 13.34

Read includes byte verification. Delete removes half the files; reopen times mounting before verification of the 500 survivors. This suite compares the two VFS buffer modes only.

iPhone benchmark · standalone run

iPhone 17 Pro · Safari

SQL and filesystem benchmarks on iOS 26.6.1 and Safari 26.6.1. Each timing is the median of three successful runs, with observed minimum and maximum values.

This standalone run uses a different collection protocol from the Mac results. No excluded full-workload warm-up sample is recorded, and the exact source commit is unavailable. Device and OS details were carried over from the owner's previous run at their request.

AHP completed the SQL suite and transaction runs successfully on this device. A separate user-reported Mac Safari attempt stalled with UnknownError: Invalid platform file handle; this was not part of the measured Mac collection. See the browser compatibility and handle usage notes. The Mac Safari AHP entries were omitted by protocol, not recorded failures. All four backends completed three successful runs. IndexedDB cleanup succeeded in this replacement collection.

The memory-buffer SQL export supplies the VFS memory-buffer result. Its repeated AHP, IndexedDB and memory-only samples remain in the raw export; their displayed SQL values come from the original disk-buffer collection. The memory-buffer transaction export supplies the VFS memory-buffer transaction result using the same selection rule.

Scroll horizontally to see all columns.

iPhone filesystem lifecycle (ms) · 100 files, 1 KiB each · three runs
Backend / phaseOPFS VFS · disk bufferOPFS VFS · memory buffer
Mount8.585.16 – 10.906.244.48 – 17.32
create0.520.20 – 2.521.841.30 – 4.66
write1.961.40 – 4.982.401.72 – 3.96
read2.100.84 – 3.401.380.58 – 1.72
rename0.540.40 – 2.582.481.90 – 5.20
delete0.160.12 – 0.800.480.36 – 1.10
flush0.820.62 – 2.021.721.40 – 3.26
reopen1.761.38 – 3.701.501.22 – 3.46

This filesystem workload uses 100 files, compared with 1,000 in the Mac collections. Each run verified 50 surviving files after deleting half. These timings are not a like-for-like device comparison.

iPhone data and methodology

PGlite 0.5.4 with an unreleased OPFS VFS build. The export does not identify the exact source commit. Disk and memory buffering, balanced VFS durability and relaxedDurability: false. The SQL suite verified that dropped tables were absent after reopening; transactions verified 10,000 retained rows. These checks do not establish crash durability. Power mode and other collection conditions were not recorded.

SQL disk JSON · SQL memory-buffer JSON · Transactions disk JSON · Transactions memory-buffer JSON · Filesystem disk JSON · Filesystem memory JSON · Collection notes and checksum

Data and methodology

Macs: five measured rounds per job, with one warm-up excluded. iPhone: three measured runs per backend, with no excluded full-workload warm-up recorded. All persistent VFS runs use balanced durability and PGlite uses relaxedDurability: false. Later explicit sync is not the total persistence cost. Clean reopening does not establish crash or power-loss durability.

Original JSON exports include every sample and collection notes. They let you verify the tables and reuse the measurements.

iPhone: SQL disk JSON · SQL memory-buffer JSON · Transactions disk JSON · Transactions memory-buffer JSON · Collection notes and checksum. The exact source commit is unavailable.

Mac measured source: 34ba9b39 plus the collector patch. PGlite 0.5.4. OPFS VFS was an unreleased build identified by the source commit and collector patch.

340 measured Mac samples across six collections, plus 36 summarized iPhone samples from 54 raw samples. Eighteen repeated SQL and transaction reference-backend samples are retained in the exports but not pooled with the original runs. These device-specific collections are not a population-wide performance estimate.

Methodology → · Analysis and reproduction notes

Storage and durability

How the backends store data and how buffering and durability settings affect persistence.

Read the storage guide →

PGlite suite

Compare OPFS VFS with PGlite's OPFS AHP, IndexedDB, and memory-only backends using the same SQL workload.

Filesystem suite

Create, read, write, rename, delete, flush, and reopen operations test filesystem behavior directly.

Run filesystem benchmarks →