使用持久变量比通过例如重新分配每个函数调用的内存更快吗? zeros()是否经常调用函数?

时间:2013-02-08 12:56:18

标签: performance matlab

假设我有一个经常调用的函数,比如由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

3 个答案:

答案 0 :(得分:2)

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

因此,我肯定会建议您使用第一个选项。


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

答案 1 :(得分:2)

如果你有一个这样的功能来测试我发现设置一个父函数非常容易,运行你正在测试的函数,1000万次并计算结果的时间。然后考虑在这里使用持久变量的时间差异和可能的权衡或副作用。如果差异是超过1000万次呼叫的百分之几,并且您实际上只是在应用程序中调用该函数10000次,则可能不值得。 YMMV。

答案 2 :(得分:1)

关于最佳实践,我会劝阻你以这种方式使用persitent变量,原因有两个。

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

此外,如果您修改它们,则必须记住在按顺序运行时清除它们以将工作区重置为干净状态。否则,如果您(或其他人)再次运行您的程序而不先清除您的persitent变量,那么前一次运行的结果。如果它们是只读的,这不是问题,但你不能强制执行它们。