You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Test files: 50 small (4 KB) + 4 large (50 KB) Python source files (total 400 KB).
Higher speed achieved by automatic compression of text-based files during transfer.
RP2040 - USB-CDC - MacOS
files
mpytool
mpremote
speedup
small 50 x 4K
9.6s (20.8 KB/s)
23.3s (8.6 KB/s)
2.4x
small 50 x 4K - skip
2.0s
5.4s
2.7x
large 4 x 50K
3.4s (58.8 KB/s)
15s (13.3 KB/s)
4.4x
large 4 x 50K - skip
0.6s
0.9s
1.5x
ESP32-C6 - USB-CDC - MacOS
files
mpytool
mpremote
speedup
small 50 x 4K
10.4s (19.2 KB/s)
30.7s (6.5 KB/s)
3.0x
small 50 x 4K - skip
5.5s
12.7s
2.3x
large 4 x 50K
4.0s (50.0 KB/s)
13.2s (15.2 KB/s)
3.3x
large 4 x 50K - skip
0.7s
1.4s
2.0x
ESP32-WROOM - USB-UART - MacOS
files
mpytool
mpremote
speedup
small 50 x 4K
32.4s (6.2 KB/s)
crash
-
small 50 x 4K - skip
11.8s
crash
-
large 4 x 50K
12.1s (16.5 KB/s)
crash
-
large 4 x 50K - skip
3.5s
crash
-
ESP32-WROVER - USB-UART - MacOS
files
mpytool
mpremote
speedup
small 50 x 4K
24.5s (8.2 KB/s)
crash
-
small 50 x 4K - skip
7.7s
crash
-
large 4 x 50K
12.0s (16.7 KB/s)
crash
-
large 4 x 50K - skip
2.2s
crash
-
ESP32-WROOM - USB-UART - Linux
files
mpytool
mpremote
speedup
small 50 x 4K
25.6s (7.8 KB/s)
66.9s (3.0 KB/s)
2.6x
small 50 x 4K - skip
5.9s
17.3s
2.9x
large 4 x 50K
7.9s (25.3 KB/s)
44.4s (4.5 KB/s)
5.6x
large 4 x 50K - skip
1.2s
2.0s
1.7x
ESP32-WROVER - USB-UART - Linux
files
mpytool
mpremote
speedup
small 50 x 4K
33.9s (5.9 KB/s)
75.0s (2.7 KB/s)
2.2x
small 50 x 4K - skip
9.8s
19.4s
2.0x
large 4 x 50K
10.0s (20.0 KB/s)
46.4s (4.3 KB/s)
4.6x
large 4 x 50K - skip
1.6s
2.5s
1.6x
Summary
Large files upload: 3.3x - 5.6x faster than mpremote
Small files upload: 2.2x - 3.0x faster than mpremote
Skip unchanged: 1.5x - 2.9x faster than mpremote
Many more test scenarios could be designed (different file types, sizes, mixed workloads), but in most cases mpytool would be at least 2x faster than mpremote.
Mount VFS Benchmark
Reading files from mounted VFS (PC filesystem accessible on device).
MacOS
Device
Test
mpytool
mpremote
Speedup
ESP32-C6 USB-CDC
50 x 2KB
0.6s
3.2s
5.6x
1 x 100KB
0.3s
0.5s
1.8x
ESP32-S3 USB-CDC
50 x 2KB
1.6s
3.9s
2.3x
1 x 100KB
0.6s
1.0s
1.7x
RP2040 USB-CDC
50 x 2KB
1.5s
3.9s
2.5x
1 x 100KB
1.0s
1.1s
1.1x
Linux
Device
Test
mpytool
mpremote
Speedup
ESP32-C6 USB-CDC
50 x 2KB
1.2s
3.3s
2.8x
1 x 100KB
0.3s
0.6s
2.0x
ESP32-S3 USB-CDC
50 x 2KB
2.2s
4.4s
2.0x
1 x 100KB
0.6s
1.1s
1.9x
RP2040 USB-CDC
50 x 2KB
1.9s
3.9s
2.1x
1 x 100KB
1.0s
1.2s
1.3x
ESP32-WROOM UART
50 x 2KB
14.1s
13.6s
1.0x
1 x 100KB
9.2s
9.4s
1.0x
Windows
Device
Test
mpytool
mpremote
Speedup
ESP32-C6 USB-CDC
50 x 2KB
2.9s
3.2s
1.1x
1 x 100KB
0.4s
0.6s
1.5x
ESP32-S3 USB-CDC
50 x 2KB
2.3s
4.0s
1.7x
1 x 100KB
0.6s
1.1s
1.8x
RP2040 USB-CDC
50 x 2KB
2.2s
3.8s
1.7x
1 x 100KB
1.1s
1.2s
1.1x
ESP32-WROOM UART
50 x 2KB
14.4s
13.8s
1.0x
1 x 100KB
9.8s
10.1s
1.0x
Summary
Batch LISTDIR (1 RTT) vs iterative ilistdir (N+1 RTT) makes significant difference when opening many files. The speedup is more pronounced on faster CPUs (ESP32-C6 160MHz vs RP2040 133MHz).
On slow UART connections (ESP32-WROOM 115200 baud), serial throughput becomes the bottleneck and both tools perform equally.