Avatar billede tzr Nybegynder
04. februar 2004 - 20:52 Der er 7 kommentarer og
1 løsning

tidsmåling på kode

Jeg skal bruge noget C++ kode der opfylder følgende pseudo kode, og kan compiles på Borland Command Line Tools (sku nok ik være nogen udfordring)

Pseudokode:
1. Generer 6000 tilfældige floating points mellem 1 og -1 (begge inklusiv) og læg dem i array x
2. Ligesom 1. bare mellem 10 og -10 (begge inklusiv) og læg dem i array w
3. Start tidsmåling
4. Multiplicér begge array med hinanden (første element med først, andet element med andet, osv) og læg summen af multiplikationerne i variabel v
5. Tag hyperbolisk tangens tanh() til v og læg resultatet i variabel u
6. Stop tidsmåling
7. Reporter tiden


Nogen der gider lave det til mig ?

Mvk Kenneth
Avatar billede tzr Nybegynder
04. februar 2004 - 20:53 #1
Mvk ? ..... med varme kager ? *G*
Avatar billede arne_v Ekspert
04. februar 2004 - 21:08 #2
Forslag:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>

using namespace std;

int main()
{
  srand(time(NULL));
  double x[6000];
  for(int i=0;i<6000;i++)
  {
      x[i]=(rand()/(double)RAND_MAX)*2-1;
  }
  double w[6000];
  for(int i=0;i<6000;i++)
  {
      w[i]=(rand()/(double)RAND_MAX)*20-10;
  }
  clock_t t1 = clock();
  double v = 0;
  for(int i=0;i<6000;i++)
  {
      v+=x[i]*w[i];
  }
  double u=tanh(v);
  clock_t t2 = clock();
  cout << "results = " << v << " " << u << " / " << (1000.0*(t2-t1))/CLOCKS_PER_SEC << " ms" << endl;
  return 0;
}
Avatar billede arne_v Ekspert
04. februar 2004 - 21:08 #3
Det returnerer iøvrigt 0 ms hver gang på min PC.

6000 operationer er ikke ret meget !
Avatar billede arne_v Ekspert
04. februar 2004 - 21:11 #4
Hvis man laver det om til:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>

using namespace std;

int main()
{
  srand(time(NULL));
  double x[6000];
  for(int i=0;i<6000;i++)
  {
      x[i]=(rand()/(double)RAND_MAX)*2-1;
  }
  double w[6000];
  for(int i=0;i<6000;i++)
  {
      w[i]=(rand()/(double)RAND_MAX)*20-10;
  }
  double v,u;
  clock_t t1 = clock();
  for(int j=0;j<1000;j++)
  {
      v = 0;
      for(int i=0;i<6000;i++)
      {
        v+=x[i]*w[i];
      }
      u=tanh(v);
  }
  clock_t t2 = clock();
  cout << "results = " << v << " " << u << " / " << (1000.0*(t2-t1))/CLOCKS_PER_SEC << " us" << endl;
  return 0;
}

så kører det på min PC på 80-90 us.
Avatar billede arne_v Ekspert
04. februar 2004 - 21:11 #5
Iøvrigt bliver u så godt som altid 1 eller -1.
Avatar billede arne_v Ekspert
04. februar 2004 - 21:12 #6
Og et svar.
Avatar billede tzr Nybegynder
04. februar 2004 - 21:39 #7
det er underordnet hvad u bliver :)
jeg vil bare vide hvor lang tid det tager ;)
Og tager fordi du satte den til at lave det hele 1000 gange, så slipper jeg selv for det, det glemte jeg nemlig.

Jeg kigger på det senere, jeg er nemlig ikke nået til den del af min rapport hvor jeg skal bruge det endnu.
men på forhånd tak for hjælpen :)
Avatar billede tzr Nybegynder
08. februar 2004 - 15:23 #8
siger mange tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester