Fonction millis() ,boucle "for"

ATOS_VQ:
Naïvement je pensais par exemple qu'un digitalwrite aurait fait après compilation ce que j'aurais pu faire en assembleur....mais c'est comme si le langage était interprété , l'instruction digitalwrite est transformé en une succession d'instructions, même si cette instruction a déjà été utilisé ....(?)

digitalWrite(), c'est une fonction issue d'une librairie. Cette librairie a été développée pour être fonctionnelle sur différents processeurs cibles. Elle crée une couche d'abstraction entre l'appellation D0, D1, D2, ... et les ports matériels desdits processeurs. Tu peux utiliser D0 sur un ATmega328, ATmega2560 ou même un processeur ARM SAM3X8E et cela va fonctionner.
Il ne faut pas perdre de vue que le "langage" Arduino n'a pas été développé pour être performant en vitesse d'exécution mais pour être facile à utiliser par des néophytes. Et d'ailleurs cela suffit pour de nombreuses personnes.

Le C permet de manipuler directement les registres du processeur comme l'a proposé hbachetti mais cela nécessite d'avoir mis le nez dans la documentation.
Il y a, comme je l'ai proposé un peu plus haut, la librairie digitalWriteFast qui à une syntaxe similaire à digitalWrite mais qui est plus rapide car l'identification des registres est faite à la compilation au lieu d'être faite à l'exécution. Mais cela impose une contrainte, si un numéro de port est variable à l'exécution on perd cette optimisation.

digitalWrite(D2,HIGH); // sera optimisé
for(i= 2;i<8;i++){
    digitalWrite(i,HIGH);  // ne sera pas optimisé et déroulera le code "standard"
}