Raspberry Pi 2 vs. 1 GPIO Benchmark
It’s battle time! Some of you may have heard that Raspberry Pi 2 is out with more punch than ever. Just how much more? Well, apt-get dist-upgrade went about 5 times faster with the new Pi. With 1 GB of RAM and four cores, this will definitely be a boost for my home SSH box ergonomics over the previous version.
But what about hacking? There has been a lot of interest in getting GPIO benchmarks for the Pi 2 similar to my earlier Raspberry Pi GPIO benchmark. Well here it is! Please refer to the earlier article for source code and nice screenshots of square waves, as I’ll concentrate on the performance difference only here. You can also get the code from Github:
https://github.com/jokkebk/rpi-gpio-benchmark
Summary of results
All the Pi 1 benchmarks were ran 14th and 15th February 2015 using latest versions of the libraries as stated in my updated benchmark post. Pi 2 benchmarks were all run 25th and 26th March 2015 with the latest versions. If you get significantly different results at a later date, please let me know and I’ll update the table!
| Language | Library | Pi 1 | Pi 2 | Change |
|---|---|---|---|---|
| Shell | /proc/mem access | 2.8 kHz | 7.0 kHz | 2,5x |
| Shell / wiringPi | WiringPi gpio utility | 40 Hz | 95 Hz | 2,4x |
| Python | RPi.GPIO | 70 kHz | 243 kHz | 2,5x |
| Python | wiringpi2 bindings | 28 kHz | 103 kHz | 3,7x |
| Ruby | wiringpi bindings | 21 kHz | N/A | 3,7x |
| C | Native library | 22 MHz | 41.7 MHz | 1,9x |
| C | BCM2835 | 5.4 MHz | 7.2 MHz | 1,3x |
| C | WiringPi normal GPIO wiringPiSetup() | 4.1 MHz | 9.3 MHz | 2,3x |
| C | WiringPi GPIO wiringPiSetupGpio() | 4.6 MHz | 9.4 MHz | 2x |
| C | WiringPi sys wiringPiSetupSys() | 120 kHz | 185 kHz | 1.5x |
| Perl | BCM2835 | 48 kHz | 154 kHz | 3.2x |
Raspberry Pi 2 GPIO Issues
It seems that not all code has yet caught up with the new version. For example, in strobe.c, peripheral base address needs to be changed from 0x20000000 to 0x3F000000:
#define BCM2708_PERI_BASE 0x3F000000
Ruby bindings for wiringpi (or wiringpi2) did not work at all for unknown reasons, possible due to the above change, or something else. At least there is following line in ext/wiringpi/WiringPi/wiringPi/wiringPi.c:
#define BCM2708_PERI_BASE 0x20000000
Conclusions
Based on the benchmarks, the Pi 2 is generally 2-3 times as fast in GPIO operations too as its predecessor. Most libraries work already very well on the new Pi member, but Ruby bindings to wiringPi still seem to have some troubles.
