35

この記事を書いた後、私はお金を口に出すことに決め、私の以前のプロジェクトを使用するように変換し始めましたrecursion-schemes

問題のデータ構造は遅延 kdtreeです。明示的および暗黙的な再帰の実装を見てください。

これは、主に次の行に沿った単純な変換です。

data KDTree v a = Node a (Node v a) (Node v a) | Leaf v a

data KDTreeF v a f = NodeF a f f | Leaf v a

シバン全体のベンチマークを行ったところ、このバージョンは通常のバージョンよりも約 2 倍遅いことがわかりました (実行KDTreeF全体ここで見つけてください)。

Fixここで私を遅くしているのは、追加のラッパーだけですか? そして、これに対して私にできることはありますか?

警告:

  • 現時点では、これは (V3 Double) に特化しています。
  • これは、アナモフィズム アプリケーションのカタ - アフターです。ハイロモーフィズムは kdtree には適していません。
  • cata (fmap foo algebra)数回使用しています。これは良い習慣ですか?
  • エドワーズrecursion-schemesパッケージを使用しています。

編集1:

これは関連していますか?https://ghc.haskell.org/trac/ghc/wiki/NewtypeWrappersnewtype Fix f = Fix (f (Fix f))「無料」 じゃない?

編集2:

別の一連のベンチマークを実行しました。今回はツリーの構築と分解をテストしました。ベンチマークはこちら: https://dl.dropboxusercontent.com/u/2359191/2014-05-15-kdtree-bench-03.html

Core の出力は、中間データ構造が完全に削除されていないことを示しており、現在は線形検索が優勢であることは驚くべきことではありませんが、KDTreeFs は s よりわずかに高速ですKDTree。あまり関係ありませんが。

4

2 に答える 2

17

Thing + ThingF + Base instanceツリーのバリアントを実装しました。そして何を推測します...これは驚くほど高速です。

これはすべての亜種の中で最も遅いという印象を受けました。私は本当に自分の投稿を読むべきでした...私が書いた行:

TreeF 構造体の痕跡が見つからない

数字が示すようにkdtreeu、新しいバリエーションです。結果は常にこれらのケースほど明確ではありませんが、ほとんどの場合、少なくとも明示的な再帰 (kdtreeベンチマーク) と同じくらい高速です。

ベンチマーク結果

于 2014-05-17T08:43:14.237 に答える