Zeitfunktion



  • Hallo, kann mir den jemand ein Programm-Listing posten, wie die Zeitmessung durchgeführt wird. Das könnte ich dann ja learning bei doing adaptieren.

    Vielen Dank



  • #include <time.h>
    
    int main()
    {
        clock_t t1, t2;
        long result;
        t1 = clock();
        /*
         *   deine Berechnungen...
         */
        t2 = clock();
        result = static_cast<long>( (t2-t1)/CLOCKS_PER_SEC) );
        // rest deines programms
    }
    

    wir sind ja alle mal nett und haben langeweile 😉



  • Skym0sh0 schrieb:

    #include <time.h>
    

    hmmm? Oo

    wie wärs mit #include <ctime> ?!

    bb



  • Hallo, habe alles so eingebaut mit <ctime> und so.
    Er meldet in dieser Zeile:

    result = static_cast<long>( (t2-t1)/CLOCKS_PER_SEC) );
    

    folgendes: ERROR: expected ";" before ")" token - main.cpp: 29

    Das ist alles.

    Was muss getan werden?



  • Zähl mal die aufgehenden und schliessenden Klammern.



  • Hallo, der Code war zu lang, ich habe die hintere Klammer rausgenommen.

    Er sieht jetzt so aus, und das Programm läuft.

    result = static_cast<long>( (t2-t1)/CLOCKS_PER_SEC);
    

    Aber: Ich wollte gern, das er eine Zeile ausgibt: das Programm braucht zur Berechnung von "Variable" zahlen xxxx sekunden!

    Wie kann ich das machen?

    Danke für die Hilfestellung



  • ixcodi schrieb:

    Aber: Ich wollte gern, das er eine Zeile ausgibt: das Programm braucht zur Berechnung von "Variable" zahlen xxxx sekunden!

    Wie kann ich das machen?

    Danke für die Hilfestellung

    In dem du Millionen Zahlen berechnen lässt und nen 386er nimmst und hoffst, dass zumindest der ma ne Sekunde braucht... Ansonsten wird da wo immer ne 0 stehen...

    10 Sekunden Suche in der MSDN:

    MSDN schrieb:

    clock_t start, finish;
    start = clock();
    /*...*/
    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    

    Da musste nur noch den hard-Cast durch nen C++-Cast ersetzen und schon bist du fertig... und vll noch std::clock () etc schreiben...

    hf

    bb



  • Hallo, ich möchte ja gerade optinieren, und dazu brauch ich die zeit, so benötigt das Programm bis zu 1 Mio ca 3 min auf dem mac...
    Also, das mit dem Anpassen ist mir zu schwierig, ich bin doch beginner...



  • Hallo, so sieht der Code aus:

    #include <Carbon/Carbon.h>
    #include <stdio.h>
    #include <ctime>
    #include <iostream>
    
    using namespace std;
    int main (int argc, char * const argv[])
    {
    clock_t t1, t2;
        long result;
        t1 = clock(); 
    
    	// den Programmcode hab ich rausgenimmen, weil er funktioniert.
    	printf("Die höchste Trigonalzahl %d\n", trigonal);
    	t2 = clock();
        result = static_cast<long>( (t2-t1)/CLOCKS_PER_SEC);
    	printf("Zeit: %d\n", result);
    
    	return 0;	
    }
    

    und so das Ergebnis

    **[Session started at 2008-08-23 15:01:51 +0200.]
    Das Programm sucht innerhalb des Intervalls von 0 bis 10000 die Zahlen heraus, welche zugleich Quadratzahlen und Trigonalzahlen sind.
    Zaehler= 0 Sum= 0 t xq = 0 Sqrt = 0
    Zaehler= 1 Sum= 1 t xq = 1 Sqrt = 1
    Zaehler= 8 Sum= 36 t xq = 36 Sqrt = 6
    Zaehler= 49 Sum= 1225 t xq = 1225 Sqrt = 35
    Zaehler= 288 Sum= 41616 t xq = 41616 Sqrt = 204
    Zaehler= 1681 Sum= 1413721 t xq = 1413721 Sqrt = 1189
    Zaehler= 9800 Sum= 48024900 t xq = 48024900 Sqrt = 6930
    Das Programm endet mit Zähler 10000
    Die höchste Trigonalzahl 49995000
    Zeit: 0 😞 😞 😮 🙄

    ds has exited with status 0.**

    ER mißt die Zeit nicht! in "result" steht nichts! Leider...



  • Und?



  • dulby schrieb:

    Hallo, ich möchte ja gerade optinieren,

    Geh auf Klo



  • Hallo Ceplusplus,

    was "und?".

    Das kann ich nicht deuten... Könntest Du etwas konkreter werden?



  • Öh wundert es dich dass 0 herauskommt?
    Du hast doch nur einen printf- Funktionsaufruf gemessen 🙄

    //EDIT:
    Oh jetzt verstehe ich dein Kommentar im Code erst...
    Dann geht die Berechnung wohl einfach so schnell, nicht?

    MfG



  • Unsinn, ich hab den ganzen Code rausgelassen, um das Listing zu verkürzen, aber wenn Di willst, poste ich das mal...

    #include <Carbon/Carbon.h>
    #include <stdio.h>
    #include <ctime>
    #include <iostream>
    
    using namespace std;
    int main (int argc, char * const argv[])
    {
    clock_t t1, t2;
        long result;
        t1 = clock(); 
    
    	long long Zaehlgrenze = 10000;	
    	long long zaehler = 0;
    	long long trigonal = 0;
    	printf("Das Programm sucht innerhalb des Intervalls von 0 bis %d die Zahlen heraus, welche zugleich Quadratzahlen und Trigonalzahlen sind. \n", Zaehlgrenze);
    	while (zaehler < Zaehlgrenze)
    	{
    trigonal = trigonal+zaehler;
    for (long long i=1, x = zaehler/2; x*x <= trigonal; i += ++x)  	
    	if (trigonal== x*x)
    		cout << "TrWurzel=\t " << zaehler  <<"\t" <<" Summe= " << trigonal  << "\nQdWurzel= \t " << x  << "\t Qudrt= " << x*x <<  "\n" <<   endl;
    
    		zaehler++;		
    	}
    	printf("Das Programm endet mit Zähler %d\n", zaehler);	
    	printf("dessen Trigonalzahl ist %d\n", trigonal);
    
    	t2 = clock();
        result = static_cast<long>( (t2-t1)/CLOCKS_PER_SEC);
    	printf("Zeit: %d\n", result);
    
    	return 0;	
    }
    

    Mich dünkt, ich habe schon den wesentlichen Programmcode includiert....

    Danke



  • braucht bei mir auch 0 Sekunden.



  • Wenn das Programm so kurz läuft, dass die Auflösung des Timers nicht reicht, um die Zeit zu messen, musst du es eben in For-Schleifen laufen lassen (z.B. eine Million Mal) und dann kannst die Dauer eines Durchgangs berechnen. Das ist aufgrund des Gesetzes der grossen Zahlen sowieso genauer als einzelne Durchgänge, bei denen noch relativ viel Zufall mitspielt.



  • Doch er funktioniert. wenn man Zaehlgrenze 100000 macht, zeigt er 4 an.

    **TrWurzel= 9800 Summe= 48024900
    QdWurzel= 6930 Qudrt= 48024900

    TrWurzel= 57121 Summe= 1631432881
    QdWurzel= 40391 Qudrt= 1631432881

    Das Programm endet mit Zähler 100000
    dessen Trigonalzahl ist 704982704
    Zeit: 4

    ds has exited with status 0.**

    Was aber mache ich, wenn ich eine genauere Zeitangabe möchte, z.b. mit Zehntelsekunden?



  • Stichwort: Performance Counter

    MfG



  • #include <windows.h>
    #include <Iostream>
    #include <time.h>
    
    using namespace std;
    
    int main()
    {
    
    	long long frequenz=0;
    	long long zeit_vorher=0; 
    	long long zeit_danach=0;
    	QueryPerformanceFrequency((LARGE_INTEGER*) &frequenz);
    	long double zeit_Skala=1.0/frequenz;
    
    	int x=0;
    	QueryPerformanceCounter((LARGE_INTEGER*) &zeit_vorher);
    
        //Zu messende Funktion
    	for (int i=0; i< 10; i++)
    	{
    		x+=1;
    	}
    
        //Ende zu messende Funktion
    
    	QueryPerformanceCounter((LARGE_INTEGER*) &zeit_danach);
    
    	long double zeit_Vergangen=(zeit_danach-zeit_vorher)*zeit_Skala;
    	cout << zeit_Vergangen << " In Sekunden";
    
    	int y;
    	cin >>y;
    
    	return 1
    }
    

    !ACHTUNG: Es kann zu Problemen bei Multipocessorsystemen kommen.

    On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function.

    http://msdn.microsoft.com/en-us/library/ms644904

    Und noch was zum Code der vor diesem Beitrag weiter oben gepostet wurde:

    long result; 
    .
    .
    .
    .
    result = static_cast<long>( (t2-t1)/CLOCKS_PER_SEC);
    

    Ihr berechnet die Zeit in ganzen ( long ) vergangenen Sekunden und wundert euch warum bei kurzen Berechnungen 0 rauskommt?
    (Der Timer ist genauer als 1ne Sekunde sonst wäre da nicht CLOCKS_PER_SEC)

    Denkt mal nach was pasiert wenn als Ergebnis z.B 0.98766 Sekunden rauskäme, aber das Ergebnis nur in ganzen Zahlen dargestellt wird.

    (Antwort weiter unten: Bitte erst selbst denken!)

    (Nein! Es wird nicht gerundet sondern alles hinter der Zahl, welche vor dem Komma steht (hier 0), einfach weggelassen!)



  • Ey... Bist du bescheuert?

    unskilled schrieb:

    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    
    result = static_cast<long>( (t2-t1)/CLOCKS_PER_SEC);
    

    Jz vergleich mal die beiden Zeilen... Ich such es dir extra raus und dann kommst du mit "ich bin noch anfänger" und machst es einfach weiterhin falsch...

    Sry, aber versuch es doch wenigstens mal so, wie es geschrieben wird - wenn das nicht funktioniert, kannst du immernoch weiter rumheulen, dass es nich geht... Davor könntest du auch mal selbst suchen und denken, aber das is anscheind erst recht zu viel verlangt...

    Und jz komm ja nich mit "jeder hat ma klein angefangen" oder so - nachdenken und lesen sollte man wohl auch von nem anfänger erwarten können... Ansonsten steht denke alles wissenswerte bei Andreas XXL im Post...

    bb


Anmelden zum Antworten