Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C++ (alle ISO-Standards) ::  wie laufzeit am genausten messen?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
wer misst misst mist
Unregistrierter




Beitrag wer misst misst mist Unregistrierter 22:07:31 06.01.2017   Titel:   wie laufzeit am genausten messen?            Zitieren

hiho,

die frage ist wahrscheinlich ein bisschen schräg aber ich weiss ehrlich gesagt nicht, wie ich die laufzeit einer funktion gut messen kann. was klar ist, ist, dass ich die funktion wiederholt ausführe und jedes mal neu messe, damit ich eine verwertbare messprobe vorliegen habe. aber wenn ich verschiedene modifikationen der funktion vergleichen möchte in ihrer performance, welche werte muss ich dann verwenden? arithmetisches mittel? mittel ohne ausreisser? median? oder gar das minimum?

LG!
wob
Unregistrierter




Beitrag wob Unregistrierter 23:40:54 06.01.2017   Titel:              Zitieren

Was meinst du mit "verschiedene Modifikationen"? Unterschiedliche Parameter? Dann hängt es natürlich davon ab, welche Modifikation du häufig aufrufst und welche nicht. Spannend ist natürlich auch immer die Variante, die im Durchschnitt am längsten braucht.

Wenn du ein und dieselbe Sache genügend oft misst, sollte sich eigentlich irgendwie ein Gauss um den Erwartungswert der Dauer ergeben.

Du könntest zum Messen z.B. https://github.com/google/benchmark benutzen.
wer misst misst mist
Unregistrierter




Beitrag wer misst misst mist Unregistrierter 00:06:45 07.01.2017   Titel:              Zitieren

mit modifikationen meine ich, dass ich die funktion modifiziere. also dinge ändere, von denen ich zum beispiel glaube, dass sie die funktion schneller machen.

meine frage ist, welchen wert ich dann optimieren soll: den median, das arithmetische mittel oder das minimum. (und ob ich "ausreisser" gezielt eliminieren soll)

profiler und frameworks dazu sind mir durchaus bekannt, es interessiert mich aber auch von einer theoretischen seite her: welcher parameter ist in so einer situation am verlässlichsten.
spätzle2
Unregistrierter




Beitrag spätzle2 Unregistrierter 00:29:47 07.01.2017   Titel:              Zitieren

Man kann nicht richtig verstehen, was du brauchst<"
wob
Unregistrierter




Beitrag wob Unregistrierter 02:25:43 07.01.2017   Titel:              Zitieren

Wenn du signifikante Unterschiede zwischen Median und Mittelwert hast, hast du nicht genügend oft gemessen.

Wie lange dauert denn bei dir eine Messung? Musst du 1 Mio mal messen, um Ergebnisse im Sekundenbereich zu bekommen? Dann ist es kein Problem, einfach oft genug zu messen, sodass seine Frage keine Rolle mehr spielt.

Dauert deine Messung dagegen 1 Stunde und eine zweite nur 50 Minuten, dann reicht das doch schon aus, um zu sehen, welche Variante schneller ist.

Ansonten gilt wie immer: kommt darauf an, was du genau wissen willst. Wieso hast du überhaupt große Ausreißer? Was misst du eigentlich? Spielen externe Effekte eine Rolle?
Mechanics
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 3987
Beitrag Mechanics Mitglied 16:36:46 07.01.2017   Titel:              Zitieren

Ich messe meistens "von Hand". D.h., zuerst einen Test schreiben, der die zu testende Funktion so oft aufruft, dass der Test ingesamt lang genug dauert, z.B. 10 Sekunden. Irgendwas im Nanosekundenbereich einzeln zu messen, macht keinen Sinn.
Dann lasse ich das vielleicht 10-20 mal laufen und schaue, obs Ausreißer gibt. Die versuche ich zu ignorieren. Dann pendelt sich das ganze schnell ein. Ich hatte damit bisher eigentlich noch nie Probleme. Die Werte waren immer recht stabil, und wenn man was optimiert hatte, dann waren sie stabil niedriger.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23203
Beitrag hustbaer Mitglied 18:29:44 08.01.2017   Titel:              Zitieren

Eine mMn. gute Variante ist die Messung so lange zu wiederholen, bis nach N (z.B. 100) Versuchen kein schnellerer Durchlauf mehr gefunden wurde als in allen Versuchen davor.
Damit bekommt man halbwegs stabile Werte und es lässt sich einfach automatisieren.

Eine andere Variante ist es den Mittelwert zu nehmen. Wobei ich dazu tendiere Ausreisser zu ignorieren, da einem fast immer das OS irgendwie dreinpfuscht. Diese Werte sind dann allerdings oft nicht ganz trivial zu vergleichen, vor allem wenn die Standardabweichung gross ist und die Mittelwerte knapp beieinander liegen.

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at


Zuletzt bearbeitet von hustbaer am 18:30:18 08.01.2017, insgesamt 1-mal bearbeitet
nachtfeuer
Moderator

Benutzerprofil
Anmeldungsdatum: 08.04.2010
Beiträge: 1975
Beitrag nachtfeuer Moderator 19:02:21 08.01.2017   Titel:              Zitieren

Man könnte auch ein Histogramm erstellen, und ein paar Grundwerte nebeneinanderstellen, jeweils niedrigster Wert, höchster Wert, Bandbreite, Anzahl der Ausreißer usw.

Oder einfach eine Tabelle bzw. mehrere, (mit den stabilsten Werten) siehe auch:
https://www.bernd-leitenberger.de/benchmark.shtml
Arcoth
Moderator

Benutzerprofil
Anmeldungsdatum: 02.10.2013
Beiträge: 3264
Beitrag Arcoth Moderator 16:04:58 09.01.2017   Titel:              Zitieren

hustbaer schrieb:
Eine mMn. gute Variante ist die Messung so lange zu wiederholen, bis nach N (z.B. 100) Versuchen kein schnellerer Durchlauf mehr gefunden wurde als in allen Versuchen davor.
Vom lieben Volkard, diese Methode.

_________________
Never be clever for the sake of being clever | "The proactive response to mathematics conflicting with your intuition is to update your intuition." (Yuan)
.keen
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.02.2015
Beiträge: 4
Beitrag .keen Mitglied 21:22:25 09.01.2017   Titel:              Zitieren

Wäre es nicht sinnvoll den Code mit "g++ -s" zu kompilieren und dann das Assembly auszuwerten. Da kann man dann doch genau zählen wie viele Schritte der Prozessor für deine Funktion benötigt.
Dann ist egal, was dein Rechner zum Zeitpunkt der Messung noch zutun hat und mit dem richtigen Script funktioniert die Auswertung auch viel schneller.


- so meine Theorie. Klärt mich bitte auf, wenn ich falsch liege.
wob
Unregistrierter




Beitrag wob Unregistrierter 21:28:00 09.01.2017   Titel:              Zitieren

Du liegst falsch, weil das Zählen nicht viel hilft.

Generell gilt zwar: weniger Schritte sind besser als mehr. Aber die Schritte sind einerseits nicht gleich schnell und andererseits können moderne Prozessoren ggf. mehrere Schritte zur selben Zeit ausgeführen. Dann gibts noch so Dinge wie einen Branch-Predictor. Außerdem musst du noch schauen, welche Daten gerade im Cache sind. Kurzum: wenn du deinen Prozessor ganz exakt kennst, mag es mit viel Aufwand möglich sein, alle Effekte genau zu erkennen und den Code zu analysieren. Aber wer kennt seinen Rechner schon so exakt?

Also ist messen die bessere Alternative.
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 26946
Beitrag SeppJ Global Moderator 21:29:59 09.01.2017   Titel:              Zitieren

Wie viele CPU-Schritte braucht denn folgender Code?
Assembler:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-4]
        pop     rbp
        ret
Die Antwort ist nicht 7.

(Bevor jemand fragt: Ich weiß die Antwort auch nicht (genau), ich weiß nur mit Sicherheit, dass sie nicht 7 ist.)

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
Mechanics
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 3987
Beitrag Mechanics Mitglied 21:56:39 09.01.2017   Titel:              Zitieren

Das bringt auch nichts, weil man oft schleifen hat usw. Und Code, der alle möglichen anderen Funktionen aufruft. Wenn du Millionen von Datensätzen verarbeitest, wie willst du in Assembler erkennen, dass ein Hash Lookup viel bringen würde gegenüber einer linearen Suche?
Zeus
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.09.2003
Beiträge: 3040
Beitrag Zeus Mitglied 22:04:10 09.01.2017   Titel:              Zitieren

SeppJ schrieb:
Wie viele CPU-Schritte braucht denn folgender Code?
Assembler:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-4]
        pop     rbp
        ret
Die Antwort ist nicht 7.

(Bevor jemand fragt: Ich weiß die Antwort auch nicht (genau), ich weiß nur mit Sicherheit, dass sie nicht 7 ist.)


Ich hab 22 bis 26 gezählt bei AMD K7 xD
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23203
Beitrag hustbaer Mitglied 22:06:32 09.01.2017   Titel:              Zitieren

Arcoth schrieb:
hustbaer schrieb:
Eine mMn. gute Variante ist die Messung so lange zu wiederholen, bis nach N (z.B. 100) Versuchen kein schnellerer Durchlauf mehr gefunden wurde als in allen Versuchen davor.
Vom lieben Volkard, diese Methode.

Hab ja auch gar nicht behauptet es erfunden zu haben :D

Ja, ich glaub ich hab das beim volkard das erste mal gesehen. IIRC hat es aber auch camper mal gepostet. Wo er es her hat weiss ich natürlich nicht, kann sein auch von volkard übernommen kann sein von woanders bzw. selbst ausgedacht.

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 26946
Beitrag SeppJ Global Moderator 23:20:58 09.01.2017   Titel:              Zitieren

Zeus schrieb:

Ich hab 22 bis 26 gezählt bei AMD K7 xD
Das ist ja auch noch geradezu eine einfache Architektur :D :)

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23203
Beitrag hustbaer Mitglied 00:01:22 10.01.2017   Titel:              Zitieren

Oder nehmen wir 68K, da gibt's super einfache Zyklen Tabellen. Damit lässt sich alles exakt bestimmen. Also so lange wir nicht Shiften oder Dividieren oder ... ach, Mist :o)

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at
HansKlaus
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2016
Beiträge: 227
Beitrag HansKlaus Mitglied 11:17:17 10.01.2017   Titel:              Zitieren

also unter windows gibts den performancecounter mit einer genauigkeit von (bei mir) 250 ns. das reicht normalerweise aus.
unter linux gibts clock_gettime.

wenn du dem prozess dann auch noch echtzeitprioritäten gibst, sollte sich die anzahl der extremen ausreißer sehr gering halten.
Arcoth
Moderator

Benutzerprofil
Anmeldungsdatum: 02.10.2013
Beiträge: 3264
Beitrag Arcoth Moderator 12:12:47 10.01.2017   Titel:              Zitieren

hustbaer schrieb:
IIRC hat es aber auch camper mal gepostet.
Und wenn ich mich recht erinnere, hat Volkard dann gefragt, ob camper es denn von ihm hat, und er meinte, das wäre möglich. Kann den Thread natürlich nicht finden.

_________________
Never be clever for the sake of being clever | "The proactive response to mathematics conflicting with your intuition is to update your intuition." (Yuan)
C++ Forum :: C++ (alle ISO-Standards) ::  wie laufzeit am genausten messen?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.