Gå til innhold

Ta tida på ei oppgåve.


Anbefalte innlegg

Hei!

 

Eg har så vidt byrja å snuse litt på C++ igjen, og eg lurer på ein ting.

 

Om eg t.d har denne koden:

 

#include <iostream>

 

using namespace std;

 

int main () {

int number = 200000;

int temp_var = 0;

while (temp_var != number ) {

cout << temp_var << endl;

temp_var++;

}

return 0;

}]/code]

 

Korleis kan eg ta tida på kor lang tid han brukar på å gjere dei 20000 utrekningane?

Lenke til kommentar
Videoannonse
Annonse
Hei!

 

Eg har så vidt byrja å snuse litt på C++ igjen, og eg lurer på ein ting.

 

Om eg t.d har denne koden:

 

#include <iostream>

using namespace std;

int main () {
   int number = 200000;
   int temp_var = 0;
   while (temp_var != number ) {
         cout << temp_var << endl;    
         temp_var++;
         }      
   return 0;
}

 

Korleis kan eg ta tida på kor lang tid han brukar på å gjere dei 20000 utrekningane?

9121486[/snapback]

 

Du må bruke en timer, tror det er noe som heter time i C biblioteket, men hvis du kjører Windows, kan du bruke High Resolution Timer, som teller antall instruksjoner siden sist gang den ble kalt.

 

QueryPerformanceCounter henter antall instruksjoner (eller noe slikt)

QueryPerformanceFrequency henter antall instruksjoner per sekund.

 

fordelen men high resolution timer, er at den aldri kan returnere null, som i noen tilfeller kunne vært katstrofalt for programmets funksjon.

 

Funksjonen er ganske enkel, først henter du frekvensen,

deretter henter du PerformanceCounter, og legger den i en midlertidig variabel (på starten)

deretter kaller du samme funksjonen på slutten, og dividerer på frekvensen, og vips! så har du antall sekunder.

 

#include <windows.h>

#include <iostream>

using namespace std;

int main () {
   LARGE_INTEGER start;
   LARGE_INTEGER end;
   LARGE_INTEGER freq;
   int number = 200000;
   int temp_var = 0;
   QueryPerformanceFrequency(&freq);
   QueryPerformanceCounter(&start);
   while (temp_var != number ) {
         cout << temp_var << endl;    
         temp_var++;
         }      
   QueryPerformanceCounter(&end);
   float variance = ((float)(end - start)) / freq;
   cout << variance;
   
   return 0;
}

 

tror det skulle fungere.

Endret av GeirGrusom
Lenke til kommentar

Eg ser at dette er litt komplisert, men eg kjem nok til å klare det!

No skal eg i midlertid lære meg å lage ein tekstbasert "avansert" kalkulator i C++. Sikkert kjekt nok det... :)

 

Ligg det langt fram i tida å lage eit program som bruker begge dei etterlengta kjernene i prosessoren min? Eg har nemleg som mål å lage eit program som fyrst gjer 2000000 utrekningar med ei kjerne, og tek tida på dei, så gjer han akkurat det same med 2 kjerner og tek tida på det.

Er det det ein kallar hyperthreading?

Lenke til kommentar
Ligg det langt fram i tida å lage eit program som bruker begge dei etterlengta kjernene i prosessoren min?

9122054[/snapback]

 

Det kommer veldig an på hvordan programmet ditt er laget. Det kan variere fra veldig vanskelig til å legge til en linje eller to(hvilke kompilator/IDE bruker du?)

 

I vs2005 med OpenMP på vil denne koden utnytte alle prosessorene

#pragma omp parallel for
for (int i = 0; i < size; i++)
{
x[i] = (y[i] + y[i+1]) / 2;
}

 

Men hvordan man opererer på spesifikke kjerner, aner jeg ikke :/

9123885[/snapback]

 

I windows er det vel SetProcessAffinityMask ogSetThreadAffinityMask som styrer hvilke prosessorer man vil bruke.

 

SetProcessAffinityMask styrer hele programmer, men SetThreadAffinityMask styrer en og en tråd.

 

edit: QueryPerformanceCounter kan gi veldig rare resultater hvis man bruker flere prosessorer sørg derfor for at man bare bruker 1 prosessor når man leser av QueryPerformanceCounter. Mulig dette er fikset på men hvis alt går skeis så vet du hva som må til.

 

 

 

lykke til

Endret av Giddion
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...