From 9dee49a9e71f0524482b9c12438098536a59d0a9 Mon Sep 17 00:00:00 2001 From: Gorniaky Date: Sun, 5 Jul 2026 17:19:34 -0300 Subject: [PATCH] fix(speed_monitor): refactor _SpeedSample to extend LinkedListEntry and optimize sample management --- lib/utils/speed_monitor.dart | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/utils/speed_monitor.dart b/lib/utils/speed_monitor.dart index 0c32f2d..053bd06 100644 --- a/lib/utils/speed_monitor.dart +++ b/lib/utils/speed_monitor.dart @@ -2,7 +2,7 @@ import "dart:collection"; import "package:discloud/cli/disposable.dart"; -final class _SpeedSample { +final class _SpeedSample extends LinkedListEntry<_SpeedSample> { _SpeedSample(this.units) : time = DateTime.now().microsecondsSinceEpoch; final int time; @@ -21,7 +21,7 @@ class SpeedMonitor implements Disposable { this._windowDuration = const .new(seconds: 1), }); - final Queue<_SpeedSample> _queue; + final LinkedList<_SpeedSample> _queue; final Duration _windowDuration; @override @@ -33,17 +33,21 @@ class SpeedMonitor implements Disposable { double add(int totalProcessedUnits) { final _SpeedSample last = .new(totalProcessedUnits); - _queue - ..removeWhere((s) => last.time - s.time > _windowDuration.inMicroseconds) - ..add(last); + _queue.add(last); - final queueIterator = _queue.iterator..moveNext(); - - final first = queueIterator.current; + _SpeedSample first = _queue.first; if (first == last) return _zero; + int baseDeltaTime = last.time - first.time; + + while (baseDeltaTime > _windowDuration.inMicroseconds) { + first.unlink(); + first = _queue.first; + baseDeltaTime = last.time - first.time; + } + return (last.units - first.units) / - ((last.time - first.time) / _windowDuration.inMicroseconds); + (baseDeltaTime / _windowDuration.inMicroseconds); } }