Eli yritän tehdä pientä eri koodien nopeutta mittaavaa ohjelmaa.
Ajanotosta vastaa WinAPI:n timeGetTime, yhdessä timeBeginPeriod:n, jonka pitäisi hieman tarkentaa ajanottoa, kanssa.
#include <windows.h> #include <stdio.h> #include <conio.h> #define LOOPS 100000000 using namespace std; void funktio1() { GetTickCount(); } void funktio2() { timeGetTime(); //timeGetTime ja GetTickCount vain esimerkkinä } void tyhja(){} int main() { long AlkuAika, ValiAika, LoppuAika, TyhjaAika; long Tulos1 = 0; long Tulos2 = 0; if (timeBeginPeriod (1) == TIMERR_NOERROR) { AlkuAika = timeGetTime(); for (long i = 0; i < LOOPS; i++) tyhja(); //Tyhjän loopin hitauden tarkistus TyhjaAika = timeGetTime() - AlkuAika; AlkuAika = timeGetTime(); for (long i = 0; i < LOOPS; i++) funktio1(); ValiAika = timeGetTime(); for (long i = 0; i < LOOPS; i++) funktio2(); LoppuAika = timeGetTime(); timeEndPeriod (1); Tulos1 = ValiAika - AlkuAika - TyhjaAika; Tulos2 = LoppuAika - ValiAika - TyhjaAika; printf ("TyhjaAika: %u ms. \nfunktio1: %u ms. \nfunktio2: %u ms.", TyhjaAika, Tulos1, Tulos2); getch(); } else printf("Koneesi ei tue winukan korkearesoluutioista ajanottoa"); }
1. Kuinka tarkka kyseinen menetelmä on, onko parempaa tapaa?
2. Miksi välillä tulo(k)s(et) pomppaa(vat) noin 4.2 miljardin tienoille, varsinkin tyhjillä funktioilla kokeiltaessa (ei mene miinukselle)?
3. Olen kuullut, että kääntäjä osaa optimoida näitä toimintoja niin, että tulokset eivät olisi realistia. Onko tämä totta?
Olen toki kääntänyt Dev-C++:n asetuksista kääntäjän optimoinnit pois.
Kirjoitat AlkuAika-muuttujan yli TyhjaAika:n laskemisen jälkeen, mutta myöhemmin laskiessasi Tulos1:tä ja Tulos2:ta sotket laskuihin kuitenkin TyhjaAika:n. Tämä luultavasti saa tuloksen joskus menemään negatiiviselle puolelle, ja kun %u:lla tulostat niin muuttujan arvo tulkitaan nimenomaan positiivisena, jolloin saat jotain, joka on lähellä 2^32.
Optimoiva kääntäjä hävittänee täysin tyhjän loopin, mutta jos kutsut esim. käyttöjärjestelmän aikafunktioita niin niitä se tuskin osaa päätellä sivuvaikutuksettomiksi ja siten turhiksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.