Seite 1 von 1

Re: Effizienter Timeframe Counter

Verfasst: Samstag 15. Juni 2013, 16:23
von Defnull
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 ;)

Re: Effizienter Timeframe Counter

Verfasst: Samstag 15. Juni 2013, 16:53
von Sirius3
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.

Re: Effizienter Timeframe Counter

Verfasst: Samstag 15. Juni 2013, 17:05
von kbr
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 ...