1

たとえば、ODE ソルバーなどによって頻繁に呼び出される関数があるとします。毎回再割り当てするよりも永続変数を使用する方が速いですか? つまり、どの関数がより高速で、ベストプラクティスは何ですか?

function ret=thisfunction(a,b,c)
  A = zeros(3)
  foo = 3;
  bar = 34;
  % ...
  % process some in A
  % ...
  ret = A\c;
end

また

function ret=thatfunction(a,b,c)
  persistent A foo bar
  if isempty(A); 
    A=zeros(3); 
    foo = 3;
    bar = 34;
  end
  % ...
  % process some in A
  % ...
  ret = A\c;
end
4

3 に答える 3

2

どちらが速いかは、変数のサイズなどに依存する可能性があるため、テストによってのみ証明できます。ただし、必要がない場合は、通常、永続変数を使用することもお勧めしません。

したがって、オプション番号1を使用することを強くお勧めします。


補足:空ではなく、存在するかどうかを確認することをお勧めします。さらに、関数スコープを離れるとAがどうなるかわかりません。永続的またはグローバルとして定義する場合は、1レベル上で実行する必要があります。

于 2013-02-08T13:06:03.637 に答える
2

このような単一の関数をテストする場合、親関数をセットアップするのは非常に簡単であることがわかりました。たとえば、テストしている関数を 1,000 万回実行し、結果の時間を計測します。次に、時間の違いと、ここで永続変数を使用することのトレードオフまたは副作用の可能性を検討してください。違いが 1,000 万回の呼び出しの数パーセントであり、実際にアプリケーションで関数を 10,000 回しか呼び出さない場合、それは価値がないかもしれません。YMMV。

于 2013-02-08T13:21:33.573 に答える
1

ベスト プラクティスに関しては、永続変数をこのように使用することはお勧めしません。理由は 2 つあります。

永続変数は外部でクリアできます。たとえば、パスに「thatfunction」がある他の関数から clear('thatfunction') を実行すると、「thatfunction」の永続変数がリセットされます。そのため、無意識のうちに別の場所でリセットされる可能性があります。これは、このコンテキストでは問題にならないかもしれませんが、関数呼び出し間で結果を保持したい場合 (永続変数の主なポイントです)、頭痛の種になる可能性があります。

また、それらを変更した場合は、ワークスペースをクリーンな状態にリセットするために、実行が完了したときに忘れずにそれらをクリアする必要があります。それ以外の場合、最初に永続変数をクリアせずにプログラムを再度実行すると、前回の実行の結果が返されます。読み取り専用であれば問題ありませんが、強制することはできません。

于 2013-02-08T23:10:46.890 に答える