samedi 20 juillet 2019

Test de vitesse: Arduino Uno / STM32 / ESP8266 / ESP32

Aujourd'hui, j'organise une petite course afin de comparer la vitesse de quatre cartes programmables au moyen de l'IDE Arduino:
  • Arduino Uno (ATmega328P, 8 bits, 16 MHz)
  • Blue Pill (STM32F103, 32 bits, 72 MHz)
  • Wemos D1 R1 (ESP8266, 32 bits, 80 MHz)
  • ESP32 (32 bits, 240 MHz)

Pour ce faire, j'ai utilisé le sketch Arduino Speed Test, une version améliorée d'un programme initialement publié sur arduino.cc. Le fonctionnement de ce programme n'a rien de bien compliqué: il consiste à chronométrer le temps nécessaire pour effectuer une même tâche plusieurs fois de suite, et à calculer la moyenne.

Un aspect intéressant, c'est que nous obtenons une comparaison des performances lorsque les 4 cartes sont programmées de la même manière, au moyen de l'IDE Arduino. La simplicité du "langage" Arduino se fait souvent au détriment de la performance, mais cette contrainte ne devrait pas désavantager une carte par rapport aux autres.

De plus, aucune des 4 cartes ne coûte significativement plus cher que les autres: il s'agit strictement de cartes offertes à très bas prix, et faciles à trouver.

Le tableau ci-dessous présente la durée de chaque test, pour chacune des 4 cartes analysées. Plus le temps mesuré est court, plus la carte est rapide.

Signification des couleurs:

Le plus rapide Le deuxième Le troisième Le plus lent

Tous les temps sont en microsecondes:

Test Uno Blue Pill ESP8266 ESP32
1/F_CPU 0,0625 0,0139 0,0125 0,0042
nop (overload) 0,26 0,07 0,05 0,021
digitalRead 4,842 0,604 0,54 0,141
digitalWrite 4,184 0,626 1,045 0,106
pinMode 4,467 2,211 1,475 2,744
multiply byte 0,632 0,11 0,1 0,037
divide byte 5,412 0,114 0,403 0,049
add byte 0,568 0,098 0,1 0,032
multiply int 1,386 0,082 0,148 0,053
divide integer 14,272 0,096 0,437 0,054
add integer 0,883 0,082 0,135 0,053
multiply long 6,102 0,084 0,148 0,051
divide long 38,662 0,096 0,422 0,049
add long 1,764 0,083 0,135 0,053
multiply float 7,49 0,989 0,738 0,051
divide float 80,187 6,971 3,772 0,224
add float 9,417 1,236 0,683 0,049
itoa() 12,957 NA 2,582 0,699
ltoa() 12,987 NA 9,297 0,699
dtostrf() 80,687 93,321 NA 11,149
random() 92,612 1,571 0,998 0,699
y |= (1<<x) 0,568 0,069 0,11 0,045
bitSet() 0,568 0,069 0,11 0,045


Les résultats sont conformes à ce que la vitesse d'horloge de chaque microcontrôleur nous permettait de prévoir: l'Arduino Uno est le plus lent, et de loin, pour la grande majorité des tests. La STM32 Blue Pill et l'ESP8266 offrent souvent des performances assez comparables, et l'ESP32 est beaucoup plus rapide que tous les autres.

La fréquence d'horloge de l'ESP32 est 15 fois plus rapide que celle de l'Arduino Uno, mais quand vient le temps de diviser deux entiers de type "long", l'ESP32 effectue l'opération...789 fois plus rapidement que le Uno!

Contrairement à ce qu'on pourrait croire à prime abord, l'utilisation d'un ESP32 n'est pas uniquement pertinente dans les applications qui nécessitent du WiFi: on peut très bien choisir de l'utiliser purement à cause de sa vitesse.

Bien sûr, ce n'est pas une raison pour jeter votre Arduino Uno à la poubelle: pour la plupart des applications, sa "faible" vitesse d'exécution est amplement suffisante.

Yves Pelletier   (TwitterFacebook)

2 commentaires:

  1. Merci beaucoup pour ce test! Les microcontrôleurs Atmel ont encore de l'avenir, notamment avec les 32u4 et leur HID USB programmable, ou les ATtiny avec leur petite taille et leur facilité d'intégration sur un circuit maison.

    RépondreSupprimer