Effizienter Timeframe Counter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

kbr hat geschrieben:Jetzt war ich doch neugierig, ob ein Ringbuffer (RollingTimeCounter) oder eine deque (EventCounter) effizienter ist und habe einen Vergleich vorgenommen:

http://pastebin.com/msjPLj96

D.h. die deque-Variante wäre ca. 2.5 mal so schnell wie der Ringbuffer.
Oder habe ich da einen Fehler übersehen?
Du hattest zwei kleine Fehler drin:
- sum() muss self.bucket mit drauf rechnen und vorher ein increment(0) machen, sonst bezieht sich sum auf das letzte Inkrement und nicht auf die Gegenwart.
- Du hast in increment() buckets übersprungen, wenn länger als self.dt nichts passiert ist. Dann waren zu alte buckets in der deque und das Erebnis verfälscht. Mit while statt if in der äußeren Bedingung/Schleife und self.bucket_lifetime += self.dt weiter hinten war das aber schnell gelöst. Dann werden 0-Buckets als Lückenfüller hinzu gefügt.

Nach den Korrekturen war deine Lösung trotzdem deutlich schneller. Ich vermute mal, das das berechnen des Bucket-index bei mir zu teuer ist (das fällt bei dir ja weg) aber das ist nur geraten. Ich klau mir deine Implementierung mal, ja? ;)


Edit: Sehr hier? Genau deshalb habe ich hier gefragt! Die Optimierungs-wettkämpfe hier im Forum sind legendär ;)
Bottle: Micro Web Framework + Development Blog
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Defnull hat geschrieben:sum() muss self.bucket mit drauf rechnen und vorher ein increment(0) machen, sonst bezieht sich sum auf das letzte Inkrement und nicht auf die Gegenwart
Mir gefiele es besser, den letzten, vielleicht nur halb gefüllten Bucket, nicht mit in die Statistik aufzunehmen.

Durch Angabe einer »maxlen« der »deque« kann man sich den »popleft« auch noch sparen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Defnull hat geschrieben:Du hattest zwei kleine Fehler drin:
Ja, stimmt. Diese Implementierungsdetails hatte ich wohl auf die Schnelle übersehen.
Defnull hat geschrieben:Ich vermute mal, das das berechnen des Bucket-index bei mir zu teuer ist (das fällt bei dir ja weg) aber das ist nur geraten. Ich klau mir deine Implementierung mal, ja?
Ich vermute ähnlich, und ja — nimm' diese Variante ruhig :wink:

Sirius3 hat geschrieben:Durch Angabe einer »maxlen« der »deque« kann man sich den »popleft« auch noch sparen.
Stimmt gleichfalls — das ist dann das Finetuning ...
Antworten