Проверяет ли 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) , как вы тогдабыть в состоянии принимать такие решения (на очень детальном уровне) для каждой программы.