georginos1989 Δημοσ. 21 Οκτωβρίου 2010 Μέλος Δημοσ. 21 Οκτωβρίου 2010 Ναι δοκίμασα με 300000 αριθμους μου βγαλε 1.. οκ.. Πως γίνετε να παρουμε δεκατα δευτερολεπτου?
georginos1989 Δημοσ. 21 Οκτωβρίου 2010 Μέλος Δημοσ. 21 Οκτωβρίου 2010 Ναι δοκίμασα με 300000 αριθμους μου βγαλε 1.. οκ.. Πως γίνετε να παρουμε δεκατα δευτερολεπτου?
Evgenios1 Δημοσ. 21 Οκτωβρίου 2010 Δημοσ. 21 Οκτωβρίου 2010 Γραψε λαθος, δεν το εχω βελτιστοποιησει. Τεσπα, η γενικη εικονα ειναι: Εαν ενα γεγονος δεν μπορεις να το μετρησεις με τις μοναδες που διαθετεις, τοτε θα αναπαραγεις το γεγονος ν φορες ωστε να φτασει στη μοναδα μετρησης που εχεις. Κοινος, θα εκτελεσεις ν φορες το κομματι που θελεις ωστε να φτασει στο ενα ms και μετα θα διαιρεσεις το ms με το ν.
georginos1989 Δημοσ. 21 Οκτωβρίου 2010 Μέλος Δημοσ. 21 Οκτωβρίου 2010 Αφου που εκανα εγω με την time τι αποτελεσμα επιστρεφει? Σκεφτηκα να το διαιρω με το 3600 πχ αναλογα με το τι επιστρεφει 1287682380 μου επιστρεφει ο t1.. αλλά σε τι το μετραει αυτο?
Evgenios1 Δημοσ. 21 Οκτωβρίου 2010 Δημοσ. 21 Οκτωβρίου 2010 Αφου που εκανα εγω με την time τι αποτελεσμα επιστρεφει?Σκεφτηκα να το διαιρω με το 3600 πχ αναλογα με το τι επιστρεφει 1287682380 μου επιστρεφει ο t1.. αλλά σε τι το μετραει αυτο? σε time_t ενα περιεργο φορματ
georginos1989 Δημοσ. 21 Οκτωβρίου 2010 Μέλος Δημοσ. 21 Οκτωβρίου 2010 και δλδ με τι πρεπει να το διαιρεσω?
Evgenios1 Δημοσ. 21 Οκτωβρίου 2010 Δημοσ. 21 Οκτωβρίου 2010 το std λεει http://www.cplusplus.com/reference/clibrary/ctime/
georginos1989 Δημοσ. 21 Οκτωβρίου 2010 Μέλος Δημοσ. 21 Οκτωβρίου 2010 Πως ομως? Πατάω εκει που λεει function αλλά δεν ανοιγει τπτ
Evgenios1 Δημοσ. 21 Οκτωβρίου 2010 Δημοσ. 21 Οκτωβρίου 2010 Σου λεει οτι για να παρεις δευτερολεπτα, πρεπει να διαιρεσεις το αποτελεσμα με CLOCKS_PER_SEC. Αυτο το μακρο -αποτι εχω ακουσει- δεν ειναι στανταρ αριθμος. αρα κανεις, (τ1-τ0)/CLOCKS_PER_SEC = δευτερολεπτα BTW δες λιγο το εν λογο σάιτ.
georginos1989 Δημοσ. 21 Οκτωβρίου 2010 Μέλος Δημοσ. 21 Οκτωβρίου 2010 ολο μηδεν βγαζει που να του σπασω το κεφαλι... Κάτι ποιο ευκολο δεν υπάρχει που να υπολογιζει τον χρονο εκτελεσης?
Directx Δημοσ. 22 Οκτωβρίου 2010 Δημοσ. 22 Οκτωβρίου 2010 ολο μηδεν βγαζει που να του σπασω το κεφαλι... Κάτι ποιο ευκολο δεν υπάρχει που να υπολογιζει τον χρονο εκτελεσης? Αν προγραμματίζεις σε Windows μπορείς να χρησιμοποιήσεις τους λεγόμενους High-Resolution Timers οι οποίοι επιστρέφουν υψηλής ακρίβειας intervals (υπέρ υψηλής ακρίβειας!) αλλά θα πρέπει να λάβεις υπόψη σου διάφορες παραμέτρους του hardware (πχ. multi-core CPUs κτλ). Ακολουθεί ένα παράδειγμα γραμμένο σε Windows API: > LARGE_INTEGER liStart, liEnd, liFreq; /* Get High-Resolution Timer frequency. */ if(!QueryPerformanceFrequency(&liFreq)) printf(" liFreq error!"); /* Mark code begin with HRes Timer. */ if(!QueryPerformanceCounter(&liStart)) printf(" liStart error!"); int CalcCnt = sum1(s,p,n); /* p, s => s, p */ /* Mark code end with HRes Timer. */ if(!QueryPerformanceCounter(&liEnd)) printf(" liEnd error!"); printf("Total Calculatons:%d\n", CalcCnt); /* Calculate HRes difference using High-Resolution Timer freq. */ printf("%.2Lf'' with FREQ=%Ld\n", (long double)(liEnd.QuadPart - liStart.QuadPart) / liFreq.QuadPart, liFreq.QuadPart); /* Just give the Raw HRes Timers results to user (if HRes freq. to short!!) */ printf("Raw Count %Ld (no FREQ adj.)\n", liEnd.QuadPart - liStart.QuadPart); Έξοδος #1 - άμεση εκτέλεση: > Give number 1 Give number 2 Give number 3 Give number 4 Give number 5 1 3 6 10 15 Total Calculatons:5 0.00'' with FREQ=3579545 Raw Count 797 (no FREQ adj.) Έξοδος #2 - εκτέλεση με διακοπή του κώδικα για 3'': > Give number 1 Give number 2 Give number 3 Give number 4 Give number 5 1 3 6 10 15 Total Calculatons:5 3.00'' with FREQ=3579545 Raw Count 10736707 (no FREQ adj.) * 2,999'' => 3,00'' (round!) Για περισσότερες λεπτομέρειες δες εδώ & εδώ. Ο κώδικας έχει δοκιμασθεί σε C++ Builder 2009 και προϋποθέτει την δήλωση του windows.h header.
V.I.Smirnov Δημοσ. 22 Οκτωβρίου 2010 Δημοσ. 22 Οκτωβρίου 2010 O DirecX έχει απόλυτο δίκιο. Κι εγώ είχα χρησιμοποιήσει τον high-resolution timer του win32 όταν πριν χρόνια έγραφα ένα πρόγραμμα στο directX 9.c και ήθελα να μετρώ τα frames. Ενθυμούμενος αυτό που είχα κάνει, να μερικές εξηγήσεις που πιστεύω κάνουν πιο κατανοητά τα γραφόμενά του και εξηγούν πώς μπορεί να μετρηθεί ένα χρονικό διάστημα όταν είναι πολύ μικρό. Παρακαλώ τον DirectX να με διορθώσει αν κάπου κάνω λάθος - πέρασαν χρόνια που τα είδα και δεν ξέρω αν κάτι έχει αλλάξει από τότε. Για ακριβής χρονικές μετρήσεις πρέπει να χρησιμοπoιηθεί το χρονόμετρο απόδοσης (performance timer). Λέγεται και μετρητής απόδοσης (performance counter). Kαταρχήν πρέπει να γίνει η προσάρτηση #include<windows.h> . O μετρητής απόδοσης μετρά σε μονάδες που λέγονται counts. Η τρέχουσα τιμή της ώρας μπορεί να ληφθεί με τον μετρητή απόδοσης μετρημένη σε counts χρησιμοποιώντας την συνάρτηση QueryPerformanceCounter ως εξής : __int64 prevTimeStamp = 0; QueryPerformanceCounter((LARGE_INTEGER*)&prevTimeStamp); Αυτή η συνάρτηση επιστρέφει την τρέχουσα ώρα μέσω του ορίσματος prevTimeStamp που είναι ένας 64 bit ακέραιος. Πρακτικά η χρήση της έγκειται στο να λαμβάνονται δυο τιμές σε διαφορετικά διαστήματα - προφανώς στην αρχή και το τέλος κάποιου υπολογισμού - και να αφαιρείται η πρώτη τιμή από την δεύτερη για να βρεθεί σε counts ο χρόνος που παρήλθε. Κάπως έτσι : __int64 A = 0; QueryPerformanceCounter((LARGE_INTEGER*)&A); /* computations */ __int64 B = 0; QueryPerformanceCounter((LARGE_INTEGER*)&; Ο χρόνος που απαιτείται για την περάτωση των υπολογισμών είναι C=Β-Α μετρημένος σε counts. Η μονάδα count δεν είναι άμεσα εποπτική. Πρέπει να μετατραπεί σε μια χρονική μονάδα που να έχει πρακτικό νόημα όπως το sec. Σε αυτό μπορεί να χρησιμοποιηθεί μια άλλη συνάρτηση API , η QueryPerformanceFrequency, που δίνει την συχνότητα του μετρητή απόδοσης σε counts/sec. H συνάρτηση αυτή καλείται ως εξής : __int64 cntsPerSec= 0; QueryPerformanceFrequency((LARGE_INTEGER*)&cntsPerSec); όπου η μεταβλητή cntsPerSec είναι όπως είπαμε counts/sec . Το αντίστροφο του cntsPerSec δίνει πόσα sec αντιστοιχούν σε κάθε count : float secsPerCnt = 1.0f / (float) cntsPerSec; και είναι ο παράγοντας μετατροπής. Έτσι , ο χρόνος που δίνει η QueryPerformanceCounter μετρημένος σε counts, μετατρέπεται σε sec πολλαπλασιάζοντάς τον με secsPerCnt : valueInSecs = valueInCounts * secsPerCnt; οπότε μετατρέπεται ο χρόνος από μονάδες counts σε sec. Επισημαίνεται επίσης ότι η συνάρτηση QueryPerformanceCounter επιστρέφει ένα τύπο BOOL. Ειδικότερα, true αν ο μετρητής απόδοσης υπάρχει και false αν δεν υπάρχει. Οι Pentium και οι μεταγενέστερες αυτών cpus έχουν τον μετρητή απόδοσης ενώ άλλοι επεξεργαστές δεν είναι βέβαιο. Η εναλλακτική σίγουρη λύση είναι η χρήση της συνάρτησης timeGetTime που όμως δεν είναι τόσο ακριβής. Μια άλλη παρατήρηση που θυμήθηκα τώρα είναι ότι ο χρόνος που απαιτείται για να σχεδιαστεί ένα frame (frame time), σε millisec ας πούμε, είναι μια διαφορετική ποσότητα από τα FPS (αν και μπορεί να ληφθεί από αυτά). Στην πράξη ο frame time είναι πιο αντιπροσωπευτικός και χρήσιμος από τα FPS παρόλο που δεν είναι γνωστό στον πολύ κόσμο και ειδικά στους gamers!!!! Με τον frame time άμεσα φαίνεται η αύξηση/μείωση στον χρόνο που απαιτείται για να σχεδιαστεί ένα frame, αντίθετα με τα FPS διότι η καμπύλη των FPS δεν είναι γραμμική. Η εξήγηση δίνεται εδώ : http://www.mvps.org/directx/articles/fps_versus_frame_time.htm -
Directx Δημοσ. 22 Οκτωβρίου 2010 Δημοσ. 22 Οκτωβρίου 2010 @Evgenios1: Thx! @V.I.Smirnov: Σωστός! -- Υ.Γ. Μια ενδιαφέρουσα σύνοψη για τα Windows timers από το MSDN (ξέχασα να την αναρτήσω χθες).
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.