2016-09-09 10 views
0

Clojureの「同じ値」割り当て

(let [a (some-function 3) b (some-function (+ 1 2)) c a] (= a b))

は、いくつかの機能は非常に大きなデータ構造(たとえば百万サイズの配列)

最初の質問を返すと仮定し、私は次のコードを持って言う:どのくらいメモリが割り当てられますか?これら3つのベクトルのそれぞれにメモリを割り当てるか、同じデータ構造を共有しますか?

2番目の質問(密接に関連しています):どのくらい速く比較するのですか? =は各要素を繰り返し処理するかどうかを決定しますか?

この単純化した例では、ダムに見えるかもしれませんが、これはかもしれ二組のconjを返しsome-function私の特定のケースで

(map some-function [1 23 1 32 1 44 1 5 1 1 1 1]) 

EDIT

のような多くの問題に類似した現実の状況があります構造は、全体依存aかどうかとbシェア

答えて

2
  1. 非常に大きな何の上にsome-functionがありますか?詳細を問わずに答えることは不可能です。 caは同じ値にバインドされるため、cのメモリ割り当ては追加されません。

  2. 一般に、=のセマンティクスと動作は、比較する値によって異なります。コレクションを比較するとyesを返した場合、=は、各要素が使い果たされるまで、または等しくない最初のペアが見つかるまで、各要素を繰り返し処理します。

さらに:比較されているオブジェクトが同じ(参照等価)であるので、acの比較は、インスタントなる場合

=まずチェックします。

異なるsome-function呼び出しが同じ構造または異なる構造を返すかどうかは確かではありませんが、メモは記されていない可能性があります。ちょうどそうでもA` `場合

(def some-function (memoize some-function)) 
+0

ような単純な(。もちろん、あなたのsome-functionが純粋であると仮定)は、二重の割り当てはありません特定するmemoizeを使用してsome-functionをラップし、'同じ値と構造の共有C 'メモリ、それらを比較するのが遅いですか? –

+0

私はちょうど私の質問にいくつかの情報を追加しました。事前に助けてくれてありがとう –

+0

@ PedroAffonso - 更新を参照してください。 –

関連する問題