Probleme mit clock() unter Linux



  • hallihallo,
    habe folgenden Zeitmessquelltext:

    #include <stdio.h>
    #include <time.h>
    
    int main()
    {
    	clock_t t1,t2;
    	int i;
    
    	t1=clock();
    
    	for(i=1;i<100000;i++)
    		printf("%i\n",i);
    
    	t2=clock();
    
    	printf("Zeit: %lf\n",((double)t2-t1)/CLOCKS_PER_SEC);
    
    	return 0;
    }
    

    Unter Windows (compiliert einmal mit vc6.0 und dann auch mit mingw) macht er das, was er soll: Eine Zahl um die 2 Sekunden mit einigen Nachkommastellen ausspucken.

    Unter Linux bekomme ich immer 1/10 der normalen Zeit. Wenn ich die Schleife länger laufen lasse und mit der Stoppuhr daneben sitz 🙂 stimmt nicht mal das (bei 40 Sekunden 6 Sekunden Differenz).

    Ich dachte clock() wäre ANSI und damit auf beiden Systemen gleich verfügbar,
    oder gibt es da doch Unterschiede?



  • - Ist clock die verstrichene Zeit auf der Uhr, oder die vom Process verbrauchte Zeit zwischen den beiden aufrufen. Ich frage das, da ich bei einem IBM-System einmal darauf hereingefallen bin. Die Funktion gab die dem Prozess zugewisene Zeit auf eine Multitasking/Multiuser System zurück und nicht die verstrichene Uhrzeit.

    - Auf echten Multiuser/Multitasking sind solche Softwareschleifen zum Zeitverbrauchen nicht funktionalbel, da sie durch die anderen Processe ständig beeinflußt werden.

    - Unter Windows solltest du zum Zeitverbrauchen Sleep() benutzen, eine ähnliche Funktion gibt es unter Unix.

    - Willst du allerdings Routinen in ihrer Laufzeit beuurteilen, so bieten die meisten System Möglichkeiten an die vom Process verbraucht Zeit abzufragen.

    - Da diese Funktionen systemspezifisch sind solltest du dir zwei Bibliotheken eine für Unix eine für Windows schreiben in denen du solche funktionen mit eine eignen API versiehst.

    Möglich wäre auch noch Funktionen aus dem POSIX-Standard zu nutzen, Unter Unix gibts die sowieso und Auch M$ hat sie ab NT implementiert und erzählt blos keinem was davon.



  • Ich zitiere irgendwoher:

    clock liefert die Rechnerkern-Zeit, die das Programm seit Beginn seiner Ausführung verbraucht hat, oder -1, wenn diese Information nicht zur Verfügung steht. clock()/CLOCKS_PER_SEC ist eine Zeit in Sekunden.

    Edit:

    Ui, du hast ja nochmal editiert.

    Mein Problem ist, dass ich gerne für Windows und Linux ein und diesselbe Funktion verwenden würde. Ich hab ja zur Zeit verschiedene Varianten.

    Und clock müsste ja auch "eigentlich" funktionieren, weil die gibt es bei beiden Plattformen, da Ansi-C. Theoretisch.



  • Somit ist eindeutig klar warum die Ergebnisse nicht mit der verstrinchen Zeit der Stopuhr übereinstimmen.



  • Möglich wäre auch noch Funktionen aus dem POSIX-Standard zu nutzen, Unter Unix gibts die sowieso und Auch M$ hat sie ab NT implementiert und erzählt blos keinem was davon.

    Holla die Waldfee, das wusste ich ja gar nicht.
    Aber wohl nur teilweise und sys/times.h ist nicht dabei :).

    Habe ich nun eine Möglichkeit unter beiden Plattformen die selbe auf zehntel, aber besser hunderstel Sekunden genaue Funktion zu nutzen?



  • Diese Art von funktionen ist immer Betriebssystemabhängig und nicht normiiert.

    Am besten man schreibt sich eine funktion MyMilliSecondClock() in zwei Bibliotheken. Bibliothek eins für Windows und nutzt die dortige Betriebsystemfunktion Bibliothek zwei für Unix mit der passenden Funktion von dort.

    Für Windows bietet sich für precises Timing nach Stopuhr diese Funktionen an, Rest siehe MSDN

    /***********************************************************************.FA*
     .FUNCTION [ giving information on elapsed total time]
    --------------------------------------------------------------------------
     .AUTHOR   [ PAD /DDT 			  ]
    --------------------------------------------------------------------------
     .DESCRIPTION
      this routine shows the elapsed time between the first call and all following
      calls. for the first time it must be called with flag=OFF. If the flag is
      set to on the elapsed time since the last oF call is returned in seconds
    --------------------------------------------------------------------------
     .PARAMETER
      int flag   [0] initialise the routine   [1]  get the difference
    --------------------------------------------------------------------------
     .RETURNVALUE
      double	the time in Seconds
    --------------------------------------------------------------------------
     .HISTORY
      Date	    Author	    Comment
      26.03.01  PAD /DDT        Definition
    **********************************************************************.HE**/
    double PerformanceTime(int flag)
    {
      static LARGE_INTEGER start;
      static double frq;
      switch (flag)  {
        case 0: {
          LARGE_INTEGER f;
          QueryPerformanceFrequency(&f);
          frq=1.00L/(double)f.QuadPart;
          QueryPerformanceCounter(&start);
          return 0.0;
        }
          break;
        default:  case 1:  {
          LARGE_INTEGER end;
          QueryPerformanceCounter(&end);
          return (((double)(end.QuadPart-start.QuadPart))*frq);
        }
          break;
      }
    }
    

Anmelden zum Antworten