Conversation
| protected string[] ReplicaAddresses { get; set; } | ||
| protected string[] ReplicaAddresses { get; } | ||
| private readonly object statsLock = new (); | ||
| private readonly Dictionary<string, (double AvgMs, int Count)> stats = new(); |
There was a problem hiding this comment.
Предложение на будущее: Лучше использовать контракты, создать класс или record или вообще структуру для хранения данных. Это более удобно использовать, читать и поддерживать)
| protected string[] GetReplicasOrderedBySpeed() | ||
| { | ||
| lock (statsLock) |
There was a problem hiding this comment.
Лучше в асинхроном коде не использовать синхронные блокировки. Это влияет на производительность
Какие варианты более правильны:
- Если есть возможность сделать эти методы асинхронными (
Task<string[]>), то за место обычногоlock(obj)использоватьSemaphoreSlim(1,1)— его ожидание асинхронное, не сильно влияет на производительность - Если нет возможности превратить эти методы в асинхронные, то лучше тогда исопльзовать
LockFreeколлекции, к примеруConcurrentDictionaryи использовать его возможности (в основном для записиAddOrUpdateили если данные не слишком важны, тоTryUpdate
| protected void RecordReplicaTime(string address, long elapsedMs) | ||
| { | ||
| lock (statsLock) |
There was a problem hiding this comment.
Тут то же замечание, что и выше
| attemptSw.Stop(); | ||
| if (completed != task) | ||
| { | ||
| RecordReplicaPenalty(addr, (long)slice.TotalMilliseconds); |
There was a problem hiding this comment.
Единственное, у нас при таймауте записываться будет в статистику не реальное время выполнения, а только время текущего кусочка таймаута — в некоторых случаях такое поведение может быть не валидным; Но в данном случае не страшно
| if (runningTasks.Count == 0) | ||
| break; | ||
|
|
||
| var delay = Task.Delay(leftSlice < leftTotal ? leftSlice : leftTotal); |
There was a problem hiding this comment.
Есть небольшая потенциальная проблема: не учитывается, что leftTotal может стать отрицательным (если общий таймаут уже истёк). Передача отрицательного значения в Task.Delay вызовет исключение ArgumentOutOfRangeException
No description provided.