mikrosekunden rausholen geht immer noch nicht gescheit!
-
hi, ich habe mit mühe boost c++ initialisert obwohl ich noob bin
es geht bei mir darum, rausfinden wie lange es dauert, bis eine Funktion durchgelaufen ist. Das eigentliche Ziel ist, wieviel performance es verbraucht.
ich hab boost genommen damit ich mikrosekunden ablesen kann. scheint aber nicht zu gehen: Ich hab eine Konsolenanwendung geschrieben welches die Mikrosekunden wiedergibt.
mit mühe in dokumentation die scripte (posix) rausgeholt, obwohl ich englisch lesen schlecht bin
http://www.boost.org/doc/html/date_time/posix_time.html#date_time.posix_time.ptime_classhier mal kurz der code den ich geschrieben hab:
#include <iostream> #include "boost/date_time/posix_time/posix_time.hpp" int main() { using namespace boost::posix_time; int x; nochmal: std::cin >> x; // Eingabe für Wiederholungen. ptime t(microsec_clock::universal_time()); for (int i = 0; i < x; i++) { std::cout << "irgendwas " << std::endl; } ptime t1(microsec_clock::universal_time()); std::cout << t << std::endl; std::cout << t1 << std::endl; goto nochmal; //nochmal testen return 0; }Ausgabe wäre dann z.b.:
5
irgendwas
irgendwas
irgendwas
irgendwas
irgendwas
2006-Nov-16 04:06:35.750000
2006-Nov-16 04:06:35.765625erste zeile: 2006-Nov-16 04:06:35.750000 wäre start
dann kommt der Durchlauf mit "irgendwas"-Zeilen
und zweite: 2006-Nov-16 04:06:35.765625 wäre stopp. Solange hat es dann gedauert.wenn ich jetzt statt zahl ne buchstabe eintippe so dass die konsole unaufhörlich durch "goto" läuft dann sehe ich diese zahlenfolge:
015625
031250
046875
062500
078125
093750
109375
125000
140625
156250
171875
187500
203125
218750
234375
250000
265625
281250
296875
312500
328125
343750
359375
375000
390625
406250
421875
437500
453125
468750
484375
500000
515625
531250
546875
562500
578125
593750
609375
625000
640625
656250
671875
687500
703125
718750
734375
750000
765625
781250
796875
....
( eigentlich wiederholen sie sich mehrmals, so:
734375
734375
734375
734375
734375
750000
750000
750000
750000
750000
765625
ich hab die nur gekürzt
)Also immer nur alle: Mikrosekunden 15625. Die ersten 2 müssten Millisekunden sein äh..ich hab die Norm wieder vergessen. Egal aber es sind schon 0,15 Sekunden ungenau. Geht das denn nicht genauer????
zweite frage: kann man nur die Mikrosekunden anzeigen lassen? Oder so ne Art Zeitstempel?
-
hallo
zu solcherlei würde ich auf volkards gesammeltes wissen um zeit zurückgreifen.
http://www.google.de/custom?hl=de&oe=ISO-8859-1&client=pub-3727475938645712&channel=7016866653&cof=FORID:1%3BL:http://www.c-plusplus.net/cms/images/logo.gif%3BLH:50%3BLW:281%3BLBGC:EAEDF4%3BGL:1%3BBGC:%23eaedf4%3BLC:%23dd6900%3BGALT:%23006699%3BGFNT:%23006699%3BGIMP:%23006699%3BDIV:%23006699%3BS:http://www.c-plusplus.net/forum%3B&domains=www.c-plusplus.net&sitesearch=www.c-plusplus.net&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=volkard+mikrosekunden&spell=1
http://www.google.de/custom?domains=www.c-plusplus.net&q=volkard+millisekunden&sa=Suchen&sitesearch=www.c-plusplus.net&client=pub-3727475938645712&forid=1&channel=7016866653&ie=ISO-8859-1&oe=ISO-8859-1&cof=GALT%3A%23006699%3BGL%3A1%3BDIV%3A%23006699%3BVLC%3ADD6900%3BAH%3Acenter%3BBGC%3AEAEDF4%3BLBGC%3AEAEDF4%3BALC%3ADD6900%3BLC%3ADD6900%3BT%3A000000%3BGFNT%3A006699%3BGIMP%3A006699%3BLH%3A114%3BLW%3A642%3BL%3Ahttp%3A%2F%2Fwww.c-plusplus.net%2Fcms%2Fimages%2Flogo.gif%3BS%3Ahttp%3A%2F%2Fwww.c-plusplus.net%2Fforum%3BFORID%3A1%3B&hl=de
ich erinner mich, dass er auf assemblerebene dazu genauso wie mit api funktionen gearbeitet hat.. einfach mal stöbern, vielleicht passt was.
-
Benutzt du zufällig Windows? Weil dann lies mal das hier, aus der Dokumentation zu ptime t(microsec_clock::local_time()):
Get the local time using a sub second resolution clock. On Unix systems this is implemented using GetTimeOfDay. On most Win32 platforms it is implemented using ftime. Win32 systems often do not achieve microsecond resolution via this API. If higher resolution is critical to your application test your platform to see the achieved resolution.
Da steht eindeutig, das Win32 Systeme hier meistens keine Microsekunden liefern. Sag uns doch bitte einfach mal welche Platform du nutzt.
-
Benutz QueryPerformanceCounter/QueryPerformanceFrequency aus der WinAPI.
-
Achja, sag uns doch noch bitte, welchen Compiler du verwendest. Denn laut http://www.boost.org/doc/html/date_time/details.html#date_time.buildinfo sind Microsekunden nicht mit allen Windows Compilern möglich.
-
Artchi schrieb:
Benutzt du zufällig Windows? Weil dann lies mal das hier, aus der Dokumentation zu ptime t(microsec_clock::local_time()):
Get the local time using a sub second resolution clock. On Unix systems this is implemented using GetTimeOfDay. On most Win32 platforms it is implemented using ftime. Win32 systems often do not achieve microsecond resolution via this API. If higher resolution is critical to your application test your platform to see the achieved resolution.
Da steht eindeutig, das Win32 Systeme hier meistens keine Microsekunden liefern. Sag uns doch bitte einfach mal welche Platform du nutzt.
hmm ja ich benütze Windows XP, AMD64 prozessor. jemand hat gesagt ich soll das benützten weil es plattformunabhängig ist. ja ok hab mir schon gedacht das da was mit Windows nicht gut gehen könnte. ich hab was mit nano verwechselt. nun ja, heisst es also, es geht mit boost nicht?
ich hab mal die von volkard durchgesucht, nur krieg ich die nicht funktionierend hin. ich benütze visual studio 8. die quellcodes die da angegegeben scheinen nicht vollständig zu sein. und andere sind für borland gedacht? hat vielleicht jemand ein funktionierender code für zeitmessung? mit start und stopp? ich suche danach solange und verschwende mehrere stunden.

EDIT: oha! mit der hier geht:
#include <iostream> #include <windows.h> using namespace std; int main() { LARGE_INTEGER start_ticks, ende_ticks, frequenz; double tick_diff = 0; start_ticks.QuadPart = 0; ende_ticks.QuadPart = 0; QueryPerformanceCounter(&start_ticks); QueryPerformanceFrequency(&frequenz); // ... hier irgendwas machen ... for (int i = 0; i < 100; i++) { cout << " irgendwas " << endl; } QueryPerformanceCounter(&ende_ticks); // benötigte zeit berechnen tick_diff = ((double) ende_ticks.QuadPart - (double) start_ticks.QuadPart) / frequenz.QuadPart; cout << tick_diff << endl; cin.get(); }geht nur auf windows oder? naja immerhin! ist dann auch egal. für andere wechsle ich dann auf boost um. wenn ihr noch tipps hat, sags mir! vielen dank!
-
funktioniert sehr gut. nur variiert sich die zeit ein wenig hm
liegt wohl an multitasking? wenn andere programme noch laufen beeinträchtigt das oder?
-
Das liegt dadran dass Windows kein Echtzeit-Betriebssystem ist. Du hast kein vom Betriebssystem garantiertes Antwort-Verhalten.
-
7H3 N4C3R schrieb:
Das liegt dadran dass Windows kein Echtzeit-Betriebssystem ist. Du hast kein vom Betriebssystem garantiertes Antwort-Verhalten.
heisst das also die leute nehmen lieber linux wenn die wirklich genau testen wollen wie lange bestimmte codes brauchen? und bringen das dann wieder auf windows?
-
"Linux" ist per se auch kein Echtzeitbetriebssystem. Aber es gibt diverse RT-Modifikationen für Linux.
-
Realtime-Betriebssysteme gibts nicht auf dem Mainstreammarkt. Mußte dich in der Indurtrie umschauen. Das wohl bekannteste RT-OS ist QNX!
-
xBlackKnightx, du musst bloss eine Wechselwirkung mit dynamischen Arrays einbauen, dann geht das.
Muahahahaha