Benchmarker une opération sur ESP32

Bonjour
je me pose la question suivante : est-il plus rapide de faire une multiplication par 0 ou de tester si l'un des paramètres est nul avant de lancer la multiplication ?

J'ai un cas où dans 30% des cas, le premier facteur de la multiplication est nul, mais c'est aléatoire. D'où la question.

J'essaie un benchmark, mais il semble que le compilateur ne veuille pas coder les multiplications, ce qui fait que j'obtiens des temps farfelus. Voici mon code, avez-vous une idée pour obtenir des temps représentatifs de mes deux cas ?

void setup() {
  Serial.begin(115200);
  uint64_t chrono;
  float a = 3.1415926536;
  float p;
  uint32_t i = 0;
  uint32_t n1 = 700000;
  uint32_t n2 = 300000;

  Serial.println("Sans test:");
  delay(30);
  chrono = micros();
  //  do {
  //    p = a * i;
  //    p = 0;
  //    ++i;
  //  } while (i < n1);
  for (i = 0; i < n1; ++i) {
    p = a * i;
  }
  a = 0;
  for (i = 0; i < n2; ++i) {
    p = a * i;
  }
  Serial.println (micros() - chrono);


  Serial.println("Avec test:");
  delay(30);
  a = 3.1415926536;
  chrono = micros();
  for (i = 0; i < n1; ++i) {
    if (a != 0) p = a * i;
    //    p = (a == 0) ? 0 : a * i;
  }
  a = 0;
  for (i = 0; i < n2; ++i) {
    if (a != 0) p = a * i;
  }
  Serial.println (micros() - chrono);

}

void loop() {

}

Comme vous voyez, je prépare d'autres pistes à tester (logique ternaire, do/while au lieu de for), mais peut-être que ça ne changera rien après compilation... ?

Merci

Bonjour,

Si le compilateur sait que a vaut 0 à la compilation, il y a de grandes chances qu'il optimise.
Si tu veux l'empécher d'optimiser tu peux déclarer a comme volatile.

En effet, ça marche comme ça :

Sans test:
8398
Avec test:
40298

Visiblement, le if ralentit beaucoup la boucle.
Merci !

Par contre, je me demande encore si les résultats sont bons :
Si je change la multiplication par une addition p = a + i;, les temps ne changent pas !

Peut être que l'algorithme est plus rapide quand un des multiplicandes vaut 0.

Si le résultat du calcul dans la boucle for n'est pas utilisé est-ce que la boucle est vraiment générée?

Je me suis posé aussi cette question. J'ai essayé de changer p = a*I par p += a*I
Mais je n'ai pas vu de différence.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.