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

哪个更快只能通过测试来证明,因为它可能取决于变量大小等。但是,我会说如果不需要,通常也不建议使用持久变量。

因此,我绝对建议您使用选项一。


旁注:您可能想检查它是否存在而不是它是否为空。此外,当您离开函数范围时,我不知道您的 A 会发生什么情况,如果您想将其定义为持久性或全局性,您可能需要将其提高一级。

于 2013-02-08T13:06:03.637 回答
2

当你有一个像这样的函数要测试时,我发现设置一个父函数非常容易,运行你正在测试的函数,比如 1000 万次并计算结果。然后考虑时间差异以及在此处使用持久变量的可能折衷或副作用。如果差异是超过 1000 万次调用的几个百分点,而您实际上只会在应用程序中调用该函数 10000 次,那么这可能不值得。YMMV。

于 2013-02-08T13:21:33.573 回答
1

关于最佳实践,我会劝阻您不要以这种方式使用持久变量,原因有两个。

持久变量可以在外部清除,例如从路径上具有“thatfunction”的任何其他函数运行 clear('thatfunction') 将重置“thatfunction”中的持久变量。因此,它们可能会在其他地方不知不觉地被重置。在这种情况下,这对您来说可能不是问题,但是如果您想在函数调用之间保留结果(这是持久变量的主要点),这可能会让您头疼。

Also, if you modify them, you'll have to remember to clear them when you're done running in-order to reset your workspace to a clean state. Otherwise if you (or someone else) runs your program again without clearing your persitent variable(s) first, the results from the previous run. This isn't an issue if they're read-only, but you cannot enforce that they will be.

于 2013-02-08T23:10:46.890 回答