2016-12-26 5 views
2

次の2行のコードはどれくらい同等ですか?NetLogoのask-withは遅延評価を確実にしますか?

ask agentset [if (attr > 0) [dosomething]] 

ask agentset with [attr > 0] [dosomething] 

速度の任意の期待(と説明できる)の違い やメモリの使用がありますか? の場合、 の場合、 の一時的なエージェントセットの作成につながるか、またはask ... withの組み合わせにより、遅延評価が保証されますか。 ?

答えて

2

。いわば、エージェントは、彼らが求めるべきであるか否かを判断する他の薬剤の属性を変更するコードを考えてみましょう:withは、エージェントが変更されないように求められ、一時agentset、作成

to go 
    ask patches with [ pcolor = red ] [ 
    ask neighbors4 [ set pcolor red ] 
    ] 
    tick 
end 

ので半ばを、頼みます。これはgoが繰り返し呼び出されるように均等に成長する赤色領域原因:今

enter image description here

を、代わりにifでそれを検討してください。

to go 
    ask patches [ 
    if pcolor = red [ 
     ask neighbors4 [ set color red ] 
    ] 
    ] 
    tick 
end 

まだ頼まれていないパッチはその色が赤に変わってきている可能性があるため、赤色領域が不均一に成長:

enter image description here

したがって、頼む-では、実際には異なる振る舞いを持ち、その後頼みます-if、それで最適化することはできません。つまり、Nicolasが述べたように、同様の最適化が行われています。

0

(免責事項:コンパイラと私の親しみは非常に表面的であるので、私は何かが欠けている可能性があります。)

A NetLogoコンパイラによって実行される最適化の(おそらく時代遅れの)リストここにあります:

https://github.com/NetLogo/NetLogo/wiki/Compiler-architecture#optimizer

(NetLogo 6.0で)それらのための実際のコードはここにある:

https://github.com/NetLogo/NetLogo/blob/bd3da2bf5495674ce5690cbb2992de4036c9db03/netlogo-core/src/main/compile/middle/optimize/package.scala

私が知る限り、ask ... withの最適化はありません。つまり、ask ... withで中間のエージェントセットを作成するため、おそらくask ... [ if ... ]より多くのメモリと時間が必要になることを意味します。

おそらくどちらを使用するべきかは、効率/可読性のトレードオフのどこにあるかによって決まります。 (私は個人的にはask ... withを読むことができます)

ask ... withを最適化することをお勧めしますか?私の意見では、絶対に。コンパイラが書かれた時点でそれをしないという技術的理由があったかもしれないと言われています。私はちょうどそれについて知らない。

確かにask ... withが最適化されていない理由は非常にあります。 2つのバージョンの間には動作上の違いがあります。読みやすさと効率の問題だけではありません。ブライアンの答えを参照してください。

尋ねる-では意図的ない怠け者です:ちょうどニコラスが言ったことで拡大する

+0

これは非常に意図的です。ブライアンの答えを参照してください。 –

+0

私は自分の答えを編集しました。 –

関連する問題