Измерение длины 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 ответ

Решение

Предпочтительный подход состоит в том, чтобы сохранить счетчик с каналом и атомарно увеличивать счетчик при записи канала, и уменьшать счетчик при чтении канала.

Ваше решение проходит через все элементы канала, что, вероятно, не будет работать хорошо для реальных высококонкурентных рабочих нагрузок.

Другие вопросы по тегам