假设我有一个经常调用的函数,比如由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
答案 0 :(得分:2)
哪一个更快只能通过测试证明,因为它可能取决于可变大小等。但是,我会说如果不需要,通常也不建议使用持久变量。
因此,我肯定会建议您使用第一个选项。
旁注:你可能想检查它是否存在而不是它是否为空。此外,我不知道当您离开功能范围时A会发生什么,如果您想将其定义为持久性或全局性,则可能需要将其更高一级。
答案 1 :(得分:2)
如果你有一个这样的功能来测试我发现设置一个父函数非常容易,运行你正在测试的函数,1000万次并计算结果的时间。然后考虑在这里使用持久变量的时间差异和可能的权衡或副作用。如果差异是超过1000万次呼叫的百分之几,并且您实际上只是在应用程序中调用该函数10000次,则可能不值得。 YMMV。
答案 2 :(得分:1)
关于最佳实践,我会劝阻你以这种方式使用persitent变量,原因有两个。
可以在外部清除Persitent变量,例如从路径上具有“thatfunction”的任何其他函数运行clear('thatfunction')将重置“thatfunction”中的persitent变量。因此,它们可能会在其他地方无意中重置。在这种情况下,这对您来说可能不是问题,但如果您想在函数调用之间保持结果(这是持久变量的主要点),这可能会让您头疼。
此外,如果您修改它们,则必须记住在按顺序运行时清除它们以将工作区重置为干净状态。否则,如果您(或其他人)再次运行您的程序而不先清除您的persitent变量,那么前一次运行的结果。如果它们是只读的,这不是问题,但你不能强制执行它们。