Czas działania algorytmu przez QueryPerformanceFrequency

0

Witam!

Mam pewien problem z obliczaniem czasu działania algorytmu. Poniżej zamieszczam kod programu. Chodzi o to, że wszystko działa dla jednokrotnego obliczenia, jednak gdy całość jest zapakowana w pętle for, która ma powtórzyć mierzenie czasu i zadany algorytm to wtedy kolejne wyniki pojawiają się jako 0. Czemu tak ? proszę o pomoc

#include<iostream>
#include <math.h>
#include <windows.h>

using namespace std;

int freq, start, end, diff;
double czas;

int main()
{
  cout.precision(15);  
  cout.setf(ios::fixed,ios::floatfield); 
  
  double a,b,dokl=0.00000000001;
  int n=1;  
  
 for (int i=0;i<5;i++)
 {
     
  QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
  QueryPerformanceCounter((LARGE_INTEGER*)&start);


  do
  {
    a= pow ((1 +  1 / double(n) ), n);  
    b= pow ((1 +  1 /double(n+1)), n+1);
   n++;
  } while((b-a)>dokl);


  cout<<"e= "<<b<<endl;  

  QueryPerformanceCounter((LARGE_INTEGER*)&end);
  diff = ((end - start) * 1000) / freq;

unsigned int milliseconds = (unsigned int)(diff & 0xffffffff);
cout << milliseconds <<endl;
}
system("PAUSE >null");
}

 

wynik:

e= 2.718271172997878
47
e= 2.718271313793099
0
e= 2.718271337088421
0
e= 2.718271357455267
0
e= 2.718271360923156
0

0

Pewnie dlatego, że masz mniej przebiegów pętli.

0

nie kumam... możesz sprecyzować ?

0

Masz pętlę do {} while w której zwiększasz n, a warunek stopu zależy od n. Na zewnątrz jest pętla for. Nie resetujesz wartości n, a więc w kolejnych iteracjach fora, pęlta do {} while wykonuje się dokładnie raz.

Gdybyś wrzucił to "n = 1" w środek fora to byś miał identyczne czasy każdej iteracji fora.

0

OK, działa - dziękuje bardzo za pomoc.

0

poza tym dzielenie, który wykonujesz, zwraca int, a faktyczny wynik to (end-start)100ns1000, czyli w sekundach będzie to (end-start)/10000. diff nie zawiera czasu w milisekundach.

0

mhm.. czyli gdy zamienię:

diff = ((end - start) * 1000) / freq;

na

diff = ((end - start) / 10000);

to wtedy diff poda wartość w milisekundach ? dobrze zrozumiałem ?

0

oj, wstyyd, głupotę napisałem: owszem, (end - start) / 10000 da wynik w ms przy założeniu, że freq = 1/100ns. ALE wynik ten będzie taki sam, jak dla ((end - start) * 1000) / freq. przy czym ten drugi kod jest lepszy, bo nie trzeba zakładać wartości freq.
miałeś więc dobrze: (end - start)/freq to zwykle bardzo mały ułamek wyrażający czas trwania w sekundach (mały, bo freq to typowo 1/100ns, czyli 10e7Hz). razy 1000 to będą milisekundy i wszystko gra, tylko trzeba uważać na typy liczb i pomnożyć przed podzieleniem, czyli tak jak zrobiłeś.

chyba muszę przestać pisać posty pod koniec dnia w pracy...

1 użytkowników online, w tym zalogowanych: 0, gości: 1