3

IORef を読み取り、いくつかの条件と計算に基づいて新しい値を作成するコードがあります。次に、その IORef に新しい値を書き込みます。しかし、まったく変更されていない可能性があります。新しい値は古い値と同じかもしれません。

IORef を書き込む前に値が異なるかどうかを確認するか、IORef を書き込むだけにするかに関する考慮事項は何ですか?

writeIORef は、設定前に値が変更されているかどうかを確認しますか?

最初に確認することで、書き込みを回避し、パフォーマンスを少し節約できますか?

4

1 に答える 1

8

writeIORef は、設定前に値が変更されているかどうかを確認しますか?

次のように定義されるラップwriteIORefwriteSTRef

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

于 2011-06-14T11:10:50.080 に答える