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 の人間が読める形式で生成された出力 (コア) を読むことを学ぶことをお勧めします。非常に細かいレベル) プログラムごとに。