Avatar billede dank Nybegynder
26. oktober 2003 - 23:22 Der er 17 kommentarer

time et script i millisekunder

Har følgende kode:

time_t  t0, t1; /* time_t is defined on <time.h> and <sys/types.h> as long */
  clock_t c0, c1; /* clock_t is defined on <time.h> and <sys/types.h> as int */
  long count;
  double a, b, c;
  t0 = time(NULL);
  c0 = clock();

... gør noget ....

printf ("\telapsed wall clock time: %ld\n", (long) (t1 - t0));
printf ("\tend (wall):              %ld\n", (long) t1);

Men er der nogen der kan se hvordan jeg istedet får resultatet i millisekunder? Eller jeg helt ved siden af, med ovenstående?
Avatar billede bertelbrander Novice
26. oktober 2003 - 23:40 #1
Avatar billede dilleberg Nybegynder
26. oktober 2003 - 23:40 #2
time() tæller kun sekunder.
clock() har en noget finere opløsning, defineret ved konstanten CLOCKS_PER_SEC.
Det er sikkert platformsafhængigt, men på Windows/Visual C++ 6.0 er CLOCKS_PER_SEC = 1000 . Dvs den opløsning du ønsker.

Eksempel:

clock_t c0 = clock();

...

clock_t c1 = clock();
printf("Elapsed time: %.3f ms\n",(double)(c1-c0)/CLOCKS_PER_SEC);

db
Avatar billede dilleberg Nybegynder
26. oktober 2003 - 23:41 #3
Ups... printf sætningen udskriver sekunder med 3 decimaler

db
Avatar billede bertelbrander Novice
26. oktober 2003 - 23:46 #4
F.ex:
#include <stdio.h>
#include <sys/time.h>

int main(void)
{
  struct timeval t1, t2;

  gettimeofday(&t1, 0);
  printf("Tryk på en tast:");
  fflush(stdout);

  getchar();

  gettimeofday(&t2, 0);

  if(t2.tv_usec - t1.tv_usec > 0)
    printf("Time: %ld sec %ld usec\n", t2.tv_sec - t1.tv_sec, t2.tv_usec - t1.tv_usec);
  else
    printf("Time: %ld sec %ld usec\n", t2.tv_sec - t1.tv_sec - 1, t2.tv_usec - t1.tv_usec + 1000000);

  return 0;
}
Avatar billede dilleberg Nybegynder
27. oktober 2003 - 00:02 #5
Vær opmærksom på, at disse funktioner giver den tid der faktisk er gået.
I et multitasking system er det ikke det samme som den tid processen bruger.
Kan man iøvrigt måle den ???

db
Avatar billede dilleberg Nybegynder
27. oktober 2003 - 00:08 #6
gettimeofday() ser interessant ud, men er ikke ANSI standard ?

db
Avatar billede bertelbrander Novice
27. oktober 2003 - 00:13 #7
gettimeofday er ikke ANSI standard. Der er ingen standard funktioner der garanterer større opløsning end 1 sec.
Selv om gettimeofday angiver tiden i usec tvivler jeg på at den har så stor opløsning.
Avatar billede bertelbrander Novice
27. oktober 2003 - 00:17 #8
ANSI C specificerer ikke noget om multitasking. På windows kan man bruge GetThreadTimes(...) til at måle den tid en tråd har brugt. Jeg kender ingen funktion der gør det samme på unix/linux (det betyder ikke at der ikke er en).
Avatar billede dank Nybegynder
27. oktober 2003 - 00:33 #9
linux:~/c/sp # ./skt
Time: 0 sec 259928 usec

Ser ud til at virke fint. Formode at ovenstående er det samme som 25.99 ms

Spørgsmålet er om der er nogen der ved hvordan ovenstående printes i ms?

svarer i?
Avatar billede bertelbrander Novice
27. oktober 2003 - 00:38 #10
259928 usec = 259.928 ms

long ms;
...

ms = (t2.tv_sec - t1.tv_sec)*1000;
ms += (t2.tv_usec - t1.tv_usec)/1000;
printf("Ms: %ld\n", ms);
Avatar billede dank Nybegynder
27. oktober 2003 - 00:46 #11
ja det virker perfekt! du glemte svaret?

Og tak endnu engang :)
Avatar billede bertelbrander Novice
27. oktober 2003 - 00:53 #12
Jeg glemte ikke at svare, jeg forsøger at undgå point.
Avatar billede arne_v Ekspert
27. oktober 2003 - 08:53 #13
Så vidt jeg ved er det:

time
  standard: ANSI
  measurement : wall time
  unit: ikke bestemt ifølge standard
        alle systemer jeg kender er det 1 sekund
  accuracy: ikke bestemt ifølge standard
            alle systemer jeg kender er det 1 sekund

clock
  standard: ANSI
  measurement : CPU time
  unit: bestemt af CLOCKS_PER_SECOND ifølge ANSI
        altid 1/1000000 ifølge POSIX
  accuracy: hardware & OS dependent

gettimeofday
  standard: common Unix
  measurement : wall time
  unit : 1 mikro sekund
  accuracy : hardware & OS dependent

Husk at fordi unit er 1/1000000 sekund, så behøver den jo ikke
at have den accuracy (altså blive øget med 1 hver /1000000 sekund - det
kan godt være den øges med 100 hver 1/10000 sekund).
Avatar billede bertelbrander Novice
27. oktober 2003 - 20:14 #14
Mine tre windows compilere (Microsoft Visual C++, Borland Builder og cygwin-gcc) har alle CLOCKS_PER_SEC til at være 1000.
I de gode gamle DOS-dage var CLOCKS_PER_SEC 18.2
Avatar billede arne_v Ekspert
27. oktober 2003 - 20:28 #15
Hverken Windows eller DOS har nogensinde hævdet at være
POSIX compliant.

Citat fra bits/time.h (included af time.h) på min Linux box:

/* ISO/IEC 9899:1990 7.12.1: <time.h>
  The macro `CLOCKS_PER_SEC' is the number per second of the value
  returned by the `clock' function. */
/* CAE XSH, Issue 4, Version 2: <time.h>
  The value of CLOCKS_PER_SEC is required to be 1 million on all
  XSI-conformant systems. */
#  define CLOCKS_PER_SEC  1000000l

#  if !defined __STRICT_ANSI__ && !defined __USE_XOPEN2K
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
  presents the real value for clock ticks per second for the system.  */
#  include <bits/types.h>
extern long int __sysconf (int);
#  define CLK_TCK ((__clock_t) __sysconf (2))  /* 2 is _SC_CLK_TCK */
#  endif
Avatar billede bertelbrander Novice
27. oktober 2003 - 20:46 #16
Jeg troede egentlig at cygwin forsøgte at være POSIX compliant.

Er der nogen der kender værdien for MingW?

LCC bruger også 1000

Min lidt bedagede version af DJGPP bruger 18.2
Avatar billede arne_v Ekspert
27. oktober 2003 - 20:49 #17
Min mingw har 1000.

Og jeg er også lidt overrasket over cygwin.
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