为啥 Matlab Profiler 说“for”循环的“end”语句存在瓶颈?

Posted

技术标签:

【中文标题】为啥 Matlab Profiler 说“for”循环的“end”语句存在瓶颈?【英文标题】:Why does the Matlab Profiler say there is a bottleneck on the 'end' statement of a 'for' loop?为什么 Matlab Profiler 说“for”循环的“end”语句存在瓶颈? 【发布时间】:2011-10-17 20:40:34 【问题描述】:

所以,我最近开始定期使用 Matlab 的内置分析器,我注意到虽然它通常能很好地显示哪些行占用的时间最多,但有时它会告诉我一个很大的for 循环的 end 语句正在使用大量时间。

现在,看到这样的一行只是用于表示循环的结束,我无法想象它如何使用除了微不足道的处理量之外的任何东西。

我在matlab central 上看到过这个问题的特定版本,但似乎没有达成共识。

编辑:这是此问题的一个最小示例:

for i =1:1000
    x = 1;
    x = [x 1];
    % clear x;
end

即使您取消注释clearend 行仍然会占用大量计算(大约 20%),而clear 实际上增加了 end 行执行的绝对计算量。

【问题讨论】:

“这可能是一个预分配问题。虽然你没有发布你的代码,所以我们很难分析它。” 我没有发布代码,因为我想知道一般情况,尽管我可以发布一个案例或具体是否有帮助。而且,如果始终是预分配问题,为什么分析器不指向进行分配的行而不是“结束”行? @zergylord:请发布一个重现问题的最小示例。您不必在此处发布整个代码。否则,我们很难尝试它,而且我们当然没有时间摆弄并想出一个可以重现问题的示例。 如果您的 Matlab 循环在数组上运行,endfor 可能会释放循环体使用的空间,但对于下一次循环迭代不是必需的。只是一个想法。 我之前已经注意到这一点,并且感觉他们将无法分配给特定代码行的整个时间负载集中到end 上。不过,重新分配是有道理的。 【参考方案1】:

当我在我的代码中看到这一点时,它是循环中创建的大型临时对象的释放。在循环中创建的每个新变量都会在 end 处释放。

【讨论】:

根据我使用 Matlab 的经验,这似乎很可能。 那么你能用clear var1显式释放变量来缓解它吗? @Marcin 感谢您的想法,但我只是尝试过无济于事:( @Marcin 所以最后一行是释放内存,然后重新计算它。显然有一个未记录的命令“profile -memory on”可以让你在你的个人资料结果中看到这种东西 @zergylord 谢谢,找到了一篇关于它的文章:Undocumented profiler options

以上是关于为啥 Matlab Profiler 说“for”循环的“end”语句存在瓶颈?的主要内容,如果未能解决你的问题,请参考以下文章

为啥@google-cloud/profiler 在 GKE 实例中运行时会抛出“permission_denied”错误?

为啥我的 Chrome Profiler 没有为我的对象显示正确的保留路径,为啥我的对象从未被释放?

是否有 IntelliJ Java Profiler [关闭]

sqlserver profiler为啥跟踪不到自定义的存储过程执行情况

为啥在 nodejs 中使用 appmetrics profiler 时我的应用程序性能得到提高

为啥 MATLAB 在使用 ode 求解器时会更改矩阵维度?