Du hattest zwei kleine Fehler drin: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?
- 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