Zeitfunktion
-
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= 48024900TrWurzel= 57121 Summe= 1631432881
QdWurzel= 40391 Qudrt= 1631432881Das Programm endet mit Zähler 100000
dessen Trigonalzahl ist 704982704
Zeit: 4ds 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 XXLim Post...bb