この質問に対する別の回答に関するコメントで、メモ化について説明しました。この手法は、プローブ パターンの密度が高い場合に役立つことに注意してください。この場合、それは同じ整数を何度もテストすることを意味します。あなたのコードが同じ作業を繰り返し、回答をキャッシュすることで利益を得る可能性はどのくらいありますか?
入力の分布についてのアイデアが得られなかったので、優れた基準パッケージを使用する簡単なベンチマークを検討してください。
module Main
where
import Criterion.Main
import Random
is_square n = sq * sq == n
where sq = floor $ sqrt $ (fromIntegral n::Double)
is_square_mem =
let check n = sq * sq == n
where sq = floor $ sqrt $ (fromIntegral n :: Double)
in (map check [0..] !!)
main = do
g <- newStdGen
let rs = take 10000 $ randomRs (0,1000::Int) g
direct = map is_square
memo = map is_square_mem
defaultMain [ bench "direct" $ whnf direct rs
, bench "memo" $ whnf memo rs
]
このワークロードは、実行していることを正しく表している場合とそうでない場合がありますが、記載されているように、キャッシュ ミス率が高すぎるように見えます。
