CircuitPython bandwidth shootout

After I sent out the video playback update, people asked me about available video rates from CircuitPython. For video playback, the important number is how fast the system can copy video data from microSD to the Gameduino Dazzler. This is just a straight copy. The video code copies data from the filesystem into the EVE's video FIFO as fast as possible. It does this by reading 2K byte chunks of file data, then writing them into EVE RAM.

The original Arduino code to do this was quite thoroughly tuned, and got about 140 Kbyte/s out of an 8-bit Atmel. That rate took some assembler and careful timing. The CircuitPython code is just a straightforward file read/write loop. I'm running the same benchmark on:




The benchmark copies an 825 Kbyte file from SDcard to the GPU. Here's the results:
Pico:    took 3.727 s, 216.294 Kbytes/s
Metro:   took 2.773 s, 290.707 Kbytes/s
Feather: took 2.677 s, 301.132 Kbytes/s
Teensy:  took 1.514 s, 532.395 Kbytes/s

(Having all four platforms here in a row was an excellent way of getting a feel for them, and in particular overall system stability. I'd say Pico and Feather are rock-solid. Metro slightly less so, because this version lacks a signal to hard-reset the Dazzler on boot. Teensy is a little more fussy, requiring power cycling more than once as I ran the benchmarks.)
  What real-world difference does this make? For video playback, it means that the MCU can play back a higher-bandwidth stream without interruption. This means higher video quality. Here's a still from a test video encoded at 800x448 that shows the difference, first at the maximum Arduino rate, 1500 Kb/s:


Now at the 2700 Kb/s possible on the Metro/Feather:


And finally at the 4000 Kb/s rate on the Teensy:


Thanks for reading.