假设我有一个由以下项目组成的项目:
在脚本中,我将在for循环中多次访问这些函数(在一分钟长的模拟中有一千多次)。每个函数也在寻找包含结构文件的数据作为计算的一部分,这些数据通常是在模拟过程中固定的参数,但需要在运行之间手动改变以观察效果。
通常这些功能构成了运行时的大部分时间,我试图节省时间,因为我的模拟无法实时运行(最终目标),而且我失去了很多时间传递函数周围的变量/参数。所以我有三个想法尝试这样做:
就系统的效率而言(随着项目的发展而最相关),并且可能因为我没有来自良好实践的专家程序员和#34;透视什么是最好的解决方案?还有其他选择我没有考虑过吗?
答案 0 :(得分:1)
如上文评论中所述 - 第1项是最佳项目。
您是否使用过探查器来查找代码占用大部分时间的位置?
profile on
% run your code
profile viewer
注意:如果要修改子函数中的输入结构 - >这将需要更多时间,但如果您只是引用它们,那么这应该不是问题。
答案 1 :(得分:0)
当在函数之间传递参数时,Matlab会执行所谓的“lazy copy”。这意味着它将指向数据的指针传递给函数,而不是创建该数据的新实例,这是非常有效的内存和速度。但是,如果在子例程中对该数据进行任何更改,则必须创建该参数的新实例,以便不覆盖main函数中的参数值。您对matlabgui的回应表明您正在这样做。因此,子程序可能在每次调用时都会生成一个完整的新结构,即使它只修改了该结构值的一小部分。
如果您的子程序正在改变数组的一小部分,那么最好的办法就是将这一小部分传递给它,然后分配输出。例如,
[modified_array] = somesubroutine(struct.original_array);
struct.original_array=modified_array;
您也可以只在一行中执行此操作。从概念上讲,传递给子例程的数据越少,内存占用量就越小。我还建议阅读in-place operations,因为它与此有关。
另外,作为一般规则,不要在Matlab中使用全局变量。我没有亲身经历,也没有读过他们真正更快的实例。