Prestatiemeting en profiling
Bij het meten van de rekensnelheid met een kleine lus als hierboven bleef de tijd vrijwel 0, ook bij een grote N. Wat is de meest waarschijnlijke oorzaak?
start = now();
for (i = 0; i < N; i++)
x = a * b + i;
end = now();
- ADe CPU heeft een speciale instructie die de berekening ogenblikkelijk afrondt
- BDe waarde van x wordt later niet gebruikt, waardoor de compiler de berekening in de lus als overbodig heeft verwijderd
- CDe klokfunctie is defect
Antwoord en toelichting tonen
Antwoord: B. De waarde van x wordt later niet gebruikt, waardoor de compiler de berekening in de lus als overbodig heeft verwijderd
Een compiler met ingeschakelde optimalisatie verwijdert berekeningen waarvan het resultaat niet wordt gebruikt als overbodige code (dead code), of berekent het resultaat van de lus vooraf en vervangt het door een constante. Daarom wordt bij microbenchmarks waarbij alleen een klein onderdeel wordt uitgelicht, de te meten berekening soms in werkelijkheid niet uitgevoerd. Tegenmaatregelen zijn het uitvoeren van het resultaat, het gebruik van volatile of andere middelen om compileroptimalisatie te voorkomen, en het controleren van de gegenereerde machinecode.