Измерение длины TChan
Мне нужно хранить буфер некоторых значений в STM. Потоки Writer должны контролировать размер буфера. Я начал реализовывать эту вещь, используя TChan, но потом обнаружил, что API не обеспечивает способ измерения длины канала. Будучи одним упрямым парнем, я сам реализовал это:
readTChanLength ch = do
empty <- isEmptyTChan ch
if empty
then return 0
else do
value <- readTChan ch
length <- readTChanLength ch
unGetTChan ch value
return $ 1 + length
Теперь все работает нормально, но мне интересно, каковы причины такой тривиальной вещи, которую не следует реализовывать в стандартной библиотеке, и каков предпочтительный подход к решению этой проблемы. Я понимаю, что этот алгоритм имеет как минимум сложность O(n), но это не может быть причиной, верно?
1 ответ
Предпочтительный подход состоит в том, чтобы сохранить счетчик с каналом и атомарно увеличивать счетчик при записи канала, и уменьшать счетчик при чтении канала.
Ваше решение проходит через все элементы канала, что, вероятно, не будет работать хорошо для реальных высококонкурентных рабочих нагрузок.