Следует проверить изменения перед написанием IORef? - PullRequest
3 голосов
/ 14 июня 2011

Есть код, который читает IORef и на основе некоторых условий и расчетов создает новое значение. Теперь он записывает новое значение в этот IORef. Но есть шанс, что это не изменилось вообще. Новое значение может быть идентично старому.

Каковы соображения относительно того, стоит ли проверять, отличается ли значение перед записью IORef, или просто записать IORef независимо от этого?

Проверяет ли writeIORef, изменяется ли значение перед установкой?

Проверив сначала, не могли бы вы избежать записи и немного сэкономить на производительности?

1 Ответ

8 голосов
/ 14 июня 2011

Проверяет ли writeIORef, изменяется ли значение перед установкой?

Нет.writeIORef обертывания writeSTRef, который определяется как

-- |Write a new value into an 'STRef'
writeSTRef :: STRef s a -> a -> ST s ()
writeSTRef (STRef var#) val = ST $ \s1# ->
    case writeMutVar# var# val s1#      of { s2# ->
    (# s2#, () #) }

Проверяя сначала, не могли бы вы избежать записи и немного сэкономить на производительности?

Что такоесоображения относительно того, стоит ли проверять, отличается ли значение перед записью IORef, или просто записать IORef независимо от этого?

Это действительно зависит от рассматриваемого алгоритма.Что вы пытаетесь оптимизировать?Какова частота чтения / записи?какие данные вы храните?как это упаковано?Какова стоимость сравнения на равенство для рассматриваемых данных?

Существует целый ряд факторов, которые необходимо учитывать при определении, хотите ли вы деструктивно обновлять ячейки на месте: какой-то специфический алгоритмнекоторые в зависимости от местоположения кэша, другие в зависимости от структуры и формы кода, который генерирует GHC.Поэтому очень сложно ответить на ваш вопрос.

Цитата от Дональда Кнута:

Мы должны забыть о небольших показателях эффективности, скажем, в 97% случаев: преждевременная оптимизация - этокорень всего зла

Если вы не находитесь на этапе, когда вы пытаетесь извлечь хоть малейшую производительность из какой-то хорошо понятой реализации, вам, вероятно, лучше выбрать путь, который

  • проще всего реализовать
  • проще всего рассуждать о

и продолжать его.Если вы находитесь на этапе, когда вы хотите настроить свою программу, я бы посоветовал вам научиться читать сгенерированный человеком вывод GHC (Core) , как вы тогдабыть в состоянии принимать такие решения (на очень детальном уровне) для каждой программы.

...