accélérer serveur web (html/css/js)

A la limite pour une meilleure lisibilité on peut coder l'envoi du fichier ainsi :

          longueur = sizeof(buffer);
          while (longueur == sizeof(buffer))
          {
            longueur = file.read(buffer, sizeof(buffer));
            if (longueur > 0)
            {
              client.write(buffer, longueur);
            }
          }
          file.close();  //close the file

Petite remarque , ça peu paraitre évident pour certain mais j'ai remarqué:

lorsque que l'on écrit:

client.println("Exemple de longue chaine de caractères à envoyer");

la chaine est encapsulé entière.

alors que:

client.println(F("Exemple de longue chaine de caractères à envoyer"));

les caractères sont envoyés un par un....

je pense que c'est donc pour cela que l'on est obligé d'envoyé ces lignes suivantes tels quelle sans la macro F():

client.println("Content-Type: text/html");
client.println("Connnection: close");;
client.println();

Exact

Les divers types d'appel de print() ou println() s'appuient sur la méthode write(), différente d'un objet à l'autre.
Et write se décline en deux versions write(uint8_t) ou write(const uint8_t *buffer, size_t size)

C'est la version write(uint8_t) qui est utilisée avec une chaîne en flash

size_t Print::print(const __FlashStringHelper *ifsh)
{
  const char PROGMEM *p = (const char PROGMEM *)ifsh;
  size_t n = 0;
  while (1) {
    unsigned char c = pgm_read_byte(p++);
    if (c == 0) break;
    n += write(c);
  }
  return n;
}

Mais quand on génère de manière dynamique des pages HTML, par assemblage de chaînes de caractères constantes, l'utilisation de la flash est vite indispensable, sous peine de bouffer toute la RAM.

La solution est de laisser tomber cette bouse de print(), et de gérer soi-même directement les write() :

  1. recopie par blocs de la flash vers un buffer temporaire en RAM
  2. envoi du buffer au client ethernet par un write(const uint8_t *buffer, size_t size)