Auteur Sujet: ESP32/ESP8266 - vitesse d'exécution  (Lu 10566 fois)

dmskd

  • Newbie
  • *
  • Messages: 45
  • Arduino et N
    • Voir le profil
ESP32/ESP8266 - vitesse d'exécution
« le: avril 20, 2021, 11:00:25 am »
Bonjour,

Je ne sais pas si c'est le bon forum et la bonne rubrique pour poser ma question, mais je vais peut-être trouver des spécialistes des ESP qui pourront m'aider.
J'ai développé depuis quelques temps une centrale DCC qui utilise un ESP8266 (WEMOS D1 MINI) pour la partie "serveur web" qui permet d'utiliser un PC, une tablette ou un smartphone pour afficher des TCO et commander les trains simplement en se connectant à la centrale.
J'ai essayé de remplacer l'ESP8266 par un ESP32-WROOM (ESP32 NodeMCU) sans rien changer au montage global et en adaptant simplement le programme pour coller avec ce circuit.

Je constate que l'affichage des pages est deux fois plus long, alors que je pensais que l'ESP32 était plus performant que l'ESP8266.

Quelqu'un aurait-il des pistes de recherche pour améliorer la chose ?

Cordialement,
Dominique
Cordialement,
Dominique

AmadeusHF

  • Full Member
  • ***
  • Messages: 204
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #1 le: avril 20, 2021, 04:45:20 pm »
La vitesse d'exécution dépend déjà de la vitesse d'horloge sélectionnée dans la configuration. Question stupide peut etre mais vous avez bien sélectionné le 240 Mhz ?

La vitesse de votre flash est bien sur 80 Mhz ?

Par ailleurs : comment sont répartis vos traitements sur les deux coeurs du M0 ?
Sébastien.
La perfection est un chemin, non un but...

dmskd

  • Newbie
  • *
  • Messages: 45
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #2 le: avril 20, 2021, 10:56:23 pm »
Je n'ai fait que reprendre le programme qui tourne sur l'ESP8266 sans rien changer.
Peut-être pouvez-vous m'indiquer où je peux en trouver plus sur ce que vous indiquez.
Quand au traitement ils est très simple, il suffit d'envoyer du code HTML et Javascript au client WiFi.
La prise en compte de la requête est instantanée, la lecture des fichiers sur la carte SD et l'exécution de la commande d'envoi (client.println) est rapide (de 0.05 à 0.15 s selon le taille des fichiers).
Mais entre l'envoi et la fin de l'affichage il se passe de l'ordre de 6 s (au lieu de 3 auparavant) pour la page la plus complexe.
Cordialement,
Dominique

Pyk35

  • Full Member
  • ***
  • Messages: 110
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #3 le: avril 20, 2021, 11:01:52 pm »
Étonnant en effet cette perte de performance.
Vous devriez publier votre code pour que l'on puisse jeter un oeil.
A+
Cédric

AmadeusHF

  • Full Member
  • ***
  • Messages: 204
    • Voir le profil
Re : Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #4 le: avril 21, 2021, 12:46:44 pm »
Je n'ai fait que reprendre le programme qui tourne sur l'ESP8266 sans rien changer.
Peut-être pouvez-vous m'indiquer où je peux en trouver plus sur ce que vous indiquez.
Quand au traitement ils est très simple, il suffit d'envoyer du code HTML et Javascript au client WiFi.
La prise en compte de la requête est instantanée, la lecture des fichiers sur la carte SD et l'exécution de la commande d'envoi (client.println) est rapide (de 0.05 à 0.15 s selon le taille des fichiers).
Mais entre l'envoi et la fin de l'affichage il se passe de l'ordre de 6 s (au lieu de 3 auparavant) pour la page la plus complexe.

Dans votre IDE arduino, là ou vous configurez le type de processeur (board), quels sont les parametres que vous avez positionné pour votre ESP32 :

  • Fréquence CPU : 240 Mhz ?
  • Fréquence FLASH : 80 Mhz ?
  • Mode flash : DIO ?
  • Niveau de debug core : NONE ?
Sébastien.
La perfection est un chemin, non un but...

dmskd

  • Newbie
  • *
  • Messages: 45
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #5 le: avril 21, 2021, 01:16:43 pm »
Je code dans l'environnement VSCODE/PLATFORMIO.
J'ai vérifié que le la fréquence du cpu est de 240 MHz, pour la féquence Flash, je ne sais pas.
J'ai ajouté dans le fichier platformio.ini "
board_f_flash= 80000000L
mais je n'ai pas encore pu tester.

Citer
Vous devriez publier votre code pour que l'on puisse jeter un oeil.

Le code qui traite les fichiers HTML est le suivant, une fois la requête analysée :

    webFile1 = SD.open("/top-base.htm");
    if (webFile && webFile1) {
      int time1 = millis();
      String content = "";
      while (webFile1.available()) {
        content += webFile1.readStringUntil('\n');
      }
      client.println(content);
      content = "";
      while (webFile.available()) {
      content += webFile.readStringUntil('\n');
      }
      client.println(content);
      content = "";
      int time2 = millis();
      Serial.println(time2-time1);
      webFile.close();
      webFile1.close();

Ce code s'exécute en 0.15s max (time2-time1).
Il y a 2 fichiers envoyés, le premier est un fichier qui inclut le code HTML, le Javascript et le CSS commun à toutes les pages, le deuxième la partie spécifique de chaque page.
Cordialement,
Dominique

Pyk35

  • Full Member
  • ***
  • Messages: 110
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #6 le: avril 21, 2021, 08:19:20 pm »
Votre code parle de carte SD, est-ce que les cartes sont identiques entre les 2 montages? Est-ce que l’objet SD n’est qu’en fait l’accès à la flash de l’esp32?

Sinon il faudrait regarder côté réseau wifi. Par exemple, est-ce que votre code force l’adresse MAC? Cela pourrait perturber votre réseau si l’autre 8266 est aussi sous tension?
Combien avez-vous de réseau wifi ou de bornes wifi ?

Pas facile à diagnostiquer ainsi. 
A+
Cédric

dmskd

  • Newbie
  • *
  • Messages: 45
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #7 le: avril 21, 2021, 10:48:08 pm »
C'est bien une carte SD qui contient les fichiers, mais la mesure de temps montre que le problème viens après la lecture, au moment de l'envoi vers le client.
C'est surtout la différence de comportement qui ne s'explique pas dans des conditions d'utilisation STRICTEMENT identiques.

Merci de vous êtes intéressé à mon problème.
Cordialement,
Dominique

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #8 le: avril 22, 2021, 08:44:41 am »
Pourquoi une carte SD alors que l'ESP32 à une mémoire SPIFFS de 4 à 8 Mo ???

Si le programme HTML JavaScrip images est lourd, il faut fonctionner avec des websockets. L'ensemble des fichiers "lourds" est chargé au démarrage, ensuite il n'y a plus que des échanges de data (commandes) quelques octes seulement. C'est le principe par exemple de mon PT : https://www.locoduino.org/spip.php?article257

Par ailleurs, l'ESP32 ne fonctionne pas du tout comme l'ESP8266 et le code (bibliothèques) optimisé pour l'un ne l'est pas forcement pour l'autre.

Ca m'intéresse d'avoir l'ensemble du code en téléchargement pour faire des tests.
« Modifié: avril 22, 2021, 08:55:16 am par bobyAndCo »

dmskd

  • Newbie
  • *
  • Messages: 45
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #9 le: avril 22, 2021, 10:02:08 am »
Citer
Pourquoi une carte SD alors que l'ESP32 à une mémoire SPIFFS de 4 à 8 Mo

Pour l'instant je ne fais que tester le remplacement de l'ESP8266 sans rien changer au montage actuel. Je rappelle que ce n'est pas la lecture des fichiers qui pénalise la durée totale de traitement.

Citer
Si le programme HTML JavaScrip images est lourd, il faut fonctionner avec des websockets.

Je sais que mon code n'est pas optimisé. J'apprends au fur et à mesure et il y a tant d'autres choses à faire. Mais les 3s d'affichage me satisfaisaient. Passer à 6s est plus ennuyeux.

Citer
Par ailleurs, l'ESP32 ne fonctionne pas du tout comme l'ESP8266 et le code (bibliothèques) optimisé pour l'un ne l'est pas forcement pour l'autre.

Dans platformio.ini j'ai défini "platform = espressif32". Peut-être n'est-ce pas suffisant.

Citer
Ca m'intéresse d'avoir l'ensemble du code en téléchargement pour faire des tests.

Code ci-joint.
« Modifié: avril 22, 2021, 10:06:48 am par dmskd »
Cordialement,
Dominique

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #10 le: avril 23, 2021, 10:14:02 am »
Bonjour,

J'ai regardé le code rapidement mais je ne l'ai pas encore testé. Il y a des choses qui ne me paraissent pas aider à un fonctionnement fluide. En tout premier lieu, j'ai vu que le programme (sur le client) interroge le serveur toutes les 3 secondes. Je ne me trompe pas ? Je ne sais pas quel volume de données est alors retourné mais toutes les 3 secondes c'est beaucoup. D'autant que le serveur ferme à chaque fois la connexion quand il a répondu au client obligeant, toutes les 3 secondes à recommencer un couteux processus d'authentification de la requête même si c'est une XMLHttpRequest. Déjà là, il faudrait chercher à gagner en rapidité en laissant simplement les connexions tcp ouvertes ce qui est très simple et ferait j'en suis sûr gagner beaucoup en vitesse de réponse.

Mais plus fondamentalement, ce sont les requêtes régulières clients -> serveur qui sont consommatrices d'où, ce que je disais dans ma réponse précédente, l'intérêt d'utiliser des websockets où c'est le serveur qui "push" vers les clients mais seulement quand il y a des modifications susceptibles de les intéresser.

Par ailleurs, même si cela ne représente pas des volumes très importants, je chercherais à optimiser en chargeant les fichiers json de description dans le localstorage du navigateur (avec une mise à jour au besoin de ces fichiers directement dans le localstorage).

Enfin, après ce premier petit tour dans le programme, je m'interroge quant à savoir s'il n'est pas possible de "déporter" plus de traitements sur le navigateur qui est grandement plus rapide qu'un ESP. Mais là il faudrait regarder plus en détails.
« Modifié: avril 23, 2021, 10:15:44 am par bobyAndCo »

dmskd

  • Newbie
  • *
  • Messages: 45
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #11 le: avril 23, 2021, 12:03:29 pm »
Bonjour et merci beaucoup pour ces remarques très constructives.

J'avoue que je ne maîtrise pas complètement le sujet et que l'application que j'ai réussi à développer me satisfaisait pour mon petit réseau. C'est simplement la limitation de l'ESP8266 à 4 clients wifi qui m'a conduit à tester l'ESP32.

Une analyse du comportement avec l'outil de développement de Firefox m'a permis de voir que ce qui prend du temps, c'est le chargement du fichier javascript (440ko) vers le client à l'affichage de la page html : 1s avec ESP8266, 3s avec ESP32. Si je déporte plus de traitement sur le navigateur, je pense que ce fichier va encore grossir.
MAIS, si on charge le javascript AVANT le css, c'est le css qui prend plus de temps, alors qu'il est 10fois plus petit.

Ensuite il n'y a plus vraiment de problème avec les rafraîchissements périodiques dont le traitement est de l'ordre 50ms donc tout à fait raisonnable.

Il va falloir que je prenne du temps pour essayer de ne pas fermer les connexions tout en gérant plusieurs clients et utiliser des websockets. Si vous avez des exemples de code, ça m'aiderait sûrement.

En attendant, encore une fois merci.
Cordialement,
Dominique

Pyk35

  • Full Member
  • ***
  • Messages: 110
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #12 le: avril 23, 2021, 02:13:27 pm »
Il faut chercher à optimiser ce fichier js.
440ko, c’est énorme. Il faudrait extraire le strict nécessaire.

Après Christophe dit vrai, une connexion / déconnexion toutes les 3s sur un microcontroleur avec pour objectif d’avoir plus de 4 clients simultanés ne me semble pas raisonnable. Les websocket et des échanges optimisés est LA solution à mettre en œuvre.

Bon courage,
A+
Cédric

dmskd

  • Newbie
  • *
  • Messages: 45
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #13 le: avril 23, 2021, 02:52:14 pm »
Citer
440ko, c’est énorme

Effectivement, mais c'est une erreur de frappe, en réalité c'est seulement 44.
Cordialement,
Dominique

dmskd

  • Newbie
  • *
  • Messages: 45
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #14 le: avril 23, 2021, 04:17:52 pm »
Question subsidiaire :
Apparemment la fonction WiFiServer.available() permet de détecter qu'un client envoie des données.
Mais comment savoir si un client est connecté même s'il n'envoie aucune de données ?
Cordialement,
Dominique