All streams
Search
Write a publication
Pull to refresh
1
0
Анатолий @iRumba

Программист C#

Send message
Я же вам сказал, повезло вам. Я в шарпе работаю. И ответил я не вам, а lisper'у :)

А про таймер, тут вы не правы ИМХО. Таймер = дополнительная нагрузка.
Я вам мне про сложность, а про динамические коллекции. Вы забываете про выделение памяти для добавляемых элементов. В результате при сложности O(1) у вас выполняется инструкций больше, чем вы рассчитывали. Помножим это на количество обращений, в итоге картинка получится не радужная.
Я тут рассуждаю про минимизацию нагрузки, а вы собираетесь вешать на функцию таймер! Еще и нагрузить выделением памяти для добавления нового элемента в очередь.
Вы знаете, весь код умещается у меня на ладошке. То есть его немного. Так что приведите конкретную реализацию. А до тех пор я не вижу плюсов. Из минусов сразу скажу, размер коллекции динамический, что значит, что при добавлении нового элемента происходит выделение памяти. А это ненужная мне дополнительная нагрузка.
Она никак не помогает решить мою задачу.
Я не знаю что делает BlockingQueue в Java, но в C# нет ничего, что мне бы подошло из коробки.
В общем способ тут не подходит. Совсем.
Проблема в том, что в ведро приходит целая операция, а уходит какая-то ее часть (эквивалент дельты времени).
В результате из ведра может утечь половина, но реально количество выполненных за последнюю секунду операций останется неизменным. В итоге функция пропускает операции, которые не должна была пропустить.

ЗЫ Я прежде чем чего то предлагать людям, стараюсь проверить сам. Попробуйте и вы. На данный момент способ видится мне нерабочим.
Блин, как тут удалять комменты? :)

Конечно же, формула будет такой
c_count = Math.Max(l_count + 1 — (c_time — l_time) /1000 * rps, 0)

Минуса с неточностью, следовательно, не будет. Но вот по производительности надо будет проверить. К ней требования выше, чем к жору оперативной памяти.
Кстати, ничего ждать мне не нужно. Вместо ожидания функция просто возвращает false
Конечно же, я напутал здесь в формуле. Но смысл не меняется
Да, если вы посмотрите предыдущие ревизии на гитхабе, то увидите, что до этого использовался как раз круговой массив из дат :)
Но мне еще важна сложность поддержки. Поэтому я сделал очевидный круговой набор данных.
Все, я вас понял. Я попробовал сделать через ведро размером rps. Каждый запрос добавлял в ведро 1 и вычитал дельту времени, поделенную на rps и умноженную на 1000.
c_count = l_count + 1 — (c_time-l_time) / rps * 1000

Плюс данного метода в том, что нет пула, то есть нет расхода оперативной памяти и сложность инициализации О(1).
А вот минусы:
  1. (c_time-l_time) / rps * 1000 — теряет точность при rps кратному простому числу начиная с 3.
  2. Количество математических операций больше (то есть расчеты выполняются дольше чем в моем способе)


Так вот для моей задачи эти минусы критичны, а лишняя оперативка — нет.
Если я не ошибаюсь, корректно построенный и скомпилированный Expression не будет давать просадку, ведь это тот же скомпилированный кусок кода.
Не должен метод дергаться по таймеру. Да и с расчетами беда у вас. но общий смысл вроде уловил. Подумаю над этим завтра. Сегодня голова уже не варит.
Что такое t_current и t_last? Если это отпечатки времени в миллисекундах, то
(t_current-t_last)*10 при разнице в полсекунды будет равно 5000.

Извините, может мне уже пора спать.
Я не понимаю. Устанавливаю счетчик на значение 10 (для 10 rps). Счетчик будет пополняться со скоростью 10 единиц в секунду до максимального значения равного 10. Он же уже 10. И зачем его дергать каждую секунду без надобности?

И как t_current (t_current-t_last) * 10 может получиться меньше 0?

Не понимаю короче.
Потому что я не вижу способа использовать здесь данный алгоритм. Но если вы знаете, подскажите.
Да, ценное замечание. Сейчас подправлю под него :)
Я ориентировался на небольшие (меньше 100). Но в целом можно использовать и для бОльших значений. Тут все будет зависеть от конкретной задачи.
А почему Вы спросили про приближенное? Вообще мне нужно ограничить количество определенных запросов от пользователя конкретной цифрой.

Information

Rating
Does not participate
Location
Томск, Томская обл., Россия
Date of birth
Registered
Activity