UPDATE2: You may also want to check out my Raspberry 2 vs 1 GPIO benchmark!
UPDATED: 2015-02-15! This article has been very popular, so I’ve now updated all the benchmarks using the latest firmware and library versions. The scope has also been upgraded to a PicoScope 5444B with better resolution and bandwith than the earlier models. :)
Don’t try this at home! Shorting GND and VCC with a probe might fry your Pi and more!
Method and Summary of Results
The basic test setup was to toggle one of the GPIO pins between zero and one as fast as possible. GPIO 4 was selected due to easy access and no overlapping functionality. This is basically the “upper limit” for any signalling one can hope to achieve with the GPIO pins – real-life scenarios where processing needs to be done would need to aim for some fraction of these values. Here are the current results:
| Language | Library | Tested / version | Square wave |
|---|---|---|---|
| Shell | /proc/mem access | 2015-02-14 | 2.8 kHz |
| Shell / gpio utility | WiringPi gpio utility | 2015-02-15 / 2.25 | 40 Hz |
| Python | RPi.GPIO | 2015-02-15 / 0.5.10 | 70 kHz |
| Python | wiringpi2 bindings | 2015-02-15 / latest github | 28 kHz |
| Ruby | wiringpi bindings | 2015-02-15 / latest gem (1.1.0) | 21 kHz |
| C | Native library | 2015-02-15 / latest RaspPi wiki code | 22 MHz |
| C | BCM 2835 | 2015-02-15 / 1.38 | 5.4 MHz |
| C | wiringPi | 2015-02-15 / 2.25 | 4.1 – 4.6 MHz |
| Perl | BCM 2835 | 2015-02-15 / 1.9 | 48 kHz |
Shell script
The easiest way to manipulate the Pi GPIO pins is via console. Here’s a simple shell script to toggle the GPIO 4 as fast as possible (add sleep 1 after both to get a nice LED toggle test):
#!/bin/sh echo "4" > /sys/class/gpio/export echo "out" > /sys/class/gpio/gpio4/direction while true do echo 1 > /sys/class/gpio/gpio4/value echo 0 > /sys/class/gpio/gpio4/value done
Continue reading Benchmarking Raspberry Pi GPIO Speed
