プログラムでGC時間を短縮しようとしています。主な容疑者は、次のコードです:大きなリスト(またはベクトル)をソートする割り当てを減らす
Data.Vector.Unboxed.fromList . take n . List.sortBy (flip $ Ord.comparing id)
$ [ (sum [ (c + a) * wsum z | (z,c) <- IntMap.toList zt_d ] , d)
| d <- IntMap.keys $ m
, let zt_d = IntMap.findWithDefault IntMap.empty d $ m ]
リストには、通常、数千の要素が含まれています。 take n . List.sortBy (flip $ Ord.comparing id)
をreturn . List.maximum
に置き換えると、私の生産性は60%から95%になるので、リストの並べ替えが原因だと思います。
割り当てを減らすためにできることはありますか?
更新
推奨されているように、私はvector-algorithms
からのインプレースの並べ替えではlist.sortを置き換えます。 おそらく私は間違っていますが、私が見ていることは割り当てがありません(リストでは63%に対して生産性は97%ですが)、プログラムは何倍も遅くなります。リストでは85秒で実行されます。並び替え;私はそれを殺しました 7分待ってからそれを殺しました。私はイントロとマージの両方の種類を試しました。ここに私のコードです:
import qualified Data.Vector.Generic.Mutable as GM
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Algorithms.Merge as Sort
import qualified Data.Vector.Fusion.Stream as Stream
import Control.Monad.ST
sortBy :: (Ord a, U.Unbox a) => (a -> a -> Ordering) -> [a] -> U.Vector a
sortBy cmp xs = runST $ do
mv <- GM.unstream . Stream.fromList $ xs
Sort.sortBy cmp mv
G.unsafeFreeze mv
なぜ「flip $ Ord.comparing id'で、「flip compare」でないのですか? – dave4420
まずベクトルに入れて、 'vector-algoirthms'パッケージを使ってベクトルをソートしてみませんか? –
@ ThomasM.DuBuisson:ベクトルアルゴリズムのソート関数は、可変ベクトルのみで動作します。 –