Можете ли вы позволить себе массив из 100 логических значений? Возможно, как битовое поле? Пока вы можете позволить себе стоимость места, вы можете отслеживать количество событий в постоянном времени:
- Магазин:
- Счетчик C, изначально 0.
- Массив логических значений B, размер которого равен числу интервалов, которые вы хотите отслеживать, т. Е. 100, изначально все ложные.
- Индекс I, изначально 0.
- Каждый интервал:
- прочитайте логическое значение в B [i] и уменьшите C, если это правда.
- установить для логического значения B [i] значение true, если событие произошло в этом интервале, в противном случае - значение false.
- Приращение C, если событие произошло в этом интервале.
- Когда я достигну 100, сбросьте его на 0.
Таким образом вы, по крайней мере, избегаете сканирования всего массива каждый интервал.
РЕДАКТИРОВАТЬ - Итак, вы хотите отслеживать события за последние 3 минуты (180 с, 18000 интервалов). Используя приведенный выше алгоритм и встраивая логические значения в битовое поле, для которого требуется общее хранилище:
2 byte unsigned integer for C
2 byte unsigned integer for I
2250 byte bit-field for B
Это в значительной степени неизбежно, если вам требуется точный подсчет количества событий за последние 180.0 секунд за все время. Я не думаю, что было бы трудно доказать, что вам нужна вся эта информация, чтобы иметь возможность дать точный ответ в любое время. Однако, если бы вы могли знать только количество событий за последние 180 +/- 2 секунды, вы могли бы вместо этого уменьшить разрешение по времени. Вот подробный пример, расширяющий мой комментарий ниже.
Вышеприведенный алгоритм обобщает:
- Магазин:
- Счетчик C, изначально 0.
- Массив счетчиков B, размер которого равен числу интервалов, которые вы хотите отслеживать, то есть 100, изначально все 0.
- Индекс I, изначально 0.
- Каждый интервал:
- читать B [i] и уменьшать C на эту величину.
- записать количество событий, произошедших за этот интервал, в B [i].
- Увеличение C на количество событий, произошедших за этот интервал.
- Когда я достигну длины B, сбросьте ее на 0.
Если вы переключите свой интервал на 2 с, то в это время могут произойти 0-200 событий. Таким образом, каждый счетчик в массиве может быть однобайтовым целым числом без знака. У вас будет 90 таких интервалов в течение 3 минут, поэтому вашему массиву потребуется 90 элементов = 90 байтов.
Если вы переключите свой интервал на 150 мс, то в это время может произойти 0-15 событий. Если вам нужно пробел, вы можете втиснуть это в полубайтовое целое число без знака. У вас будет 1200 таких интервалов за 3 минуты, поэтому вашему массиву потребуется 1200 элементов = 600 байт.