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();
  1. ADe CPU heeft een speciale instructie die de berekening ogenblikkelijk afrondt
  2. BDe waarde van x wordt later niet gebruikt, waardoor de compiler de berekening in de lus als overbodig heeft verwijderd
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Prestatiemeting en profiling

  1. Waarom wordt bij het meten van de uitvoeringstijd van een programma dezelfde meting vaak vele malen herhaald en worden de eerste resultaten weggelaten?
  2. Welke combinatie van probleem en tegenmaatregel is juist wanneer de tijd van een zeer korte bewerking slechts één keer wordt gemeten?
  3. Welk verschil tussen “wandkloktijd” (wall-clock time) en “CPU-tijd” bij het meten van de uitvoeringstijd is juist?
  4. Welke uitleg van doorvoer (throughput) en latentie (latency) van een server is juist?
  5. Waarom wordt bij de evaluatie van de responstijd van een webservice vaak niet alleen het gemiddelde bekeken, maar ook het 99e percentiel (de grens van de langzaamste 1 %)?