0

私はこのコードを持っていました:

:history
(cons [t (:latest thing)] (take n (:history thing)) )

これは、プログラムの反復ごとに、最近の履歴のローリング ウィンドウをマップに追加するためのものでした。私が見つけたのは、特定の回数 (~ 50) の反復の後、私のプログラムは劇的にそして次第に遅くなるということでした。

一方、コードを次のように変更した場合:

:history
(cons [t (:latest thing)] (take n (vec (:history thing))) )

その後、プログラムは反復ごとにわずかに長く実行されましたが (レイジー seq が実現されたため)、一貫して実行され、速度が低下することはありませんでした。

Clojureを初めて使用するのでわかりません...チャンクされたシーケンスと関係がありますか?

4

1 に答える 1

1

プログラムのスローダウンとは、「最初のコードサンプルが行うコンス操作により、シーケンスが大きくなるにつれて、この遅延シーケンスの消費が遅くなる」という意味だと思います。これは、cons のような遅延演算子を使用して遅延シーケンスを作成すると、一連の操作 (関数) が作成されてシーケンスが生成され、この遅延シーケンスを消費するたびにこの操作チェーンが実行されるためです。これは、シーケンスを消費するたびに実行されます。これは、50 要素のベクトルを使用してそれを消費するよりも明らかに遅くなります。

2番目のケースでは、遅延シーケンスには1つの操作(つまり、短所)しかなく、残りはすでに実現されたベクトル(つまり、ベクトル呼び出し)から操作されます

于 2012-04-13T04:13:51.140 に答える