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