-
- Да в принципе можно и так как вы пишите, но вместо односвязного
списка - очередь упорядоченная по оставшемуся времени. Сортировка
по времени происходит в момент добавления события. В момент
обработки события событие выбрасывается, и головой очереди
становится следующее. НО если нужно сформировать какую-то циклическую последовательной
действий очень все это не красиво будет. - Boвa(23.10.2020 16:02)
- Проблема линейной очереди -- гигантское время вставки если в
очереди 6144 таймеров, например. Кроме того API прикладного уровня
может иметь, например, функцию остановки/отмены запущенного
таймера. Т.е. нужны операции: 1) вставки в очередь, 2) извлечение
из головы очереди, 3) удаление произвольного элемента. Бинарная
куча выглядит диковато и перетряхивает вообще всю память, но у ней
худшее время понятно. Есть вариант со скип-листами, но там удалить
физически нельзя, только fk0(427 знак., 23.10.2020 20:49, ссылка)
- Есть замечательная статья, расписывающая возможные подходы к
организации списка таймеров - lloyd(23.10.2020 21:10, ссылка)
- "Simple Timing Wheels" -- это какой-то испорченный пересказ на тему bucket queue. Для которых известно, что они хорошо работают когда там распределение равномерное и/или число приоритетов -- небольшое. В нашем случае числа большие (32-битное время, например) и распределение явно не равномерное, все таймеры могут свалиться в один bucket. "Since there may be many timers in any given slot, we maintain an ordered list of timers for each slot..." -- и здесь мы возвращаемся к fk0(1897 знак., 23.10.2020 22:28, ссылка)
- Заводить 64К софтварных таймеров это новые
вершиныЭвересты говнокода. Я так не умею, увы. - Boвa(23.10.2020 21:06)- В этом и важное свойство библиотечных функций или функций ядра ОС,
что они не знают, что там у тебя. И способны работать и в таких
ситуациях. А для себя ты можешь сказать "мне в проекте достаточно
10 таймеров". А ядро ОС или библиотека не могут так сказать. - fk0(23.10.2020 21:10)
- Эта тема немного про другое. (См. старттопик.) - Boвa(23.10.2020 21:15)
- В этом и важное свойство библиотечных функций или функций ядра ОС,
что они не знают, что там у тебя. И способны работать и в таких
ситуациях. А для себя ты можешь сказать "мне в проекте достаточно
10 таймеров". А ядро ОС или библиотека не могут так сказать. - fk0(23.10.2020 21:10)
- Есть замечательная статья, расписывающая возможные подходы к
организации списка таймеров - lloyd(23.10.2020 21:10, ссылка)
- Проблема линейной очереди -- гигантское время вставки если в
очереди 6144 таймеров, например. Кроме того API прикладного уровня
может иметь, например, функцию остановки/отмены запущенного
таймера. Т.е. нужны операции: 1) вставки в очередь, 2) извлечение
из головы очереди, 3) удаление произвольного элемента. Бинарная
куча выглядит диковато и перетряхивает вообще всю память, но у ней
худшее время понятно. Есть вариант со скип-листами, но там удалить
физически нельзя, только fk0(427 знак., 23.10.2020 20:49, ссылка)
- Да в принципе можно и так как вы пишите, но вместо односвязного
списка - очередь упорядоченная по оставшемуся времени. Сортировка
по времени происходит в момент добавления события. В момент
обработки события событие выбрасывается, и головой очереди
становится следующее. НО если нужно сформировать какую-то циклическую последовательной
действий очень все это не красиво будет. - Boвa(23.10.2020 16:02)