MATLAB 可执行文件太慢
Posted
技术标签:
【中文标题】MATLAB 可执行文件太慢【英文标题】:MATLAB executable is too slow 【发布时间】:2013-04-12 09:02:24 【问题描述】:我使用 MATLAB 中的 deploytool
将我的 MATLAB 程序转换为基于控制台的应用程序。 MATLAB .m
文件执行大约需要 2 秒,但在我将其转换为可执行文件并调用 .exe
后,执行需要 45 秒,这太长了。
我想将 MATLAB 程序与 php 集成。有没有另一种有效和快速的方法来做到这一点?在我的项目中,时间确实是一个很大的因素(不是开发时间,而是应用程序的执行时间)。那么有没有更省时的方法呢?
我在网上看到我们可以写PHP扩展来调用MATLAB。这个方法快还是和调用.exe
文件一样? MATLAB 编码器对这个过程有帮助吗?如果有其他选择,请提及。
【问题讨论】:
您可能想做的一件事是跟踪实际计算时间。至少你可以查明是调用慢了还是计算本身慢了。 我如何追踪它?我使用了运行和时间,但它只给出了总时间。 matlab .m 文件只需要 2 秒来执行,但我提到的 exe 需要 45 秒,所以是不是调用很慢? 可能,但不一定,因为可能有不同的输入/条件。我通常使用tic
和toc
来记录时间差异。
是的,exe和.m文件中代码的执行时间略有不同。对于.m文件:经过时间为1.661620秒。经过时间为0.004483秒。对于两个进程。对于 exe 文件,经过的时间是 2.610610 秒。经过时间是 0.021953 秒。对于相同的两个进程。但是 exe 的总执行时间是 40 秒,所以我认为调用 exe 需要时间。有什么办法可以解决这个问题?
【参考方案1】:
MATLAB 编译的 .exe 在您第一次运行时会受到开销,因为它正在启动 MCR:Why does my application compiled with the MATLAB Compiler 4.1 take a long time to start up?
除非您注销或重新启动操作系统,否则 MCR 将保持预加载状态。另一个有用的阅读:Speeding up compiled apps startup。
“Why does my stand-alone created using the MATLAB Compiler take longer to start the first time?”还报告连续运行应该更快,但是如果稍后重新运行,则必须在内存中重新加载进程。
您可以将您的代码包含在tic toc
中,部署它并检查执行所花费的时间,以防止启动开销。
加速.exe
的替代方法是使用 PHP 调用 MATLAB。如果您保持 MATLAB 会话打开,您会遇到一次开销。您可以在启动时启动 MATLAB,从而避免在调用 PHP 期间特别承受开销。
如需了解更多信息,请阅读 Calling MATLAB from PHP,并请记住,除非特别需要,否则不要使用 exit
。
【讨论】:
编写已编译应用程序的最佳实践是开发它们,以便它们可以运行而无需经常重新启动。也就是说,您可以尝试将您的应用程序设计为除非绝对必要,否则它不会退出。这样就不需要经常初始化 MCR。但是我怎样才能做到这一点呢? 除非您注销或重新启动操作系统,否则 MCR 将保持预加载状态。另一个有用的阅读:Speeding up compiled apps startup 我尝试连续执行exe文件但时间没有变化 虽然你回答的内容是正确的,但我不认为它回答了这个问题。 我假设您通过设置MCR_CACHE_ROOT
(我之前评论中的链接)没有任何改进?技术方案“Why does my stand-alone created using the MATLAB Compiler take longer to start the first time?”也报告说连续运行应该会更快,但是如果稍后再运行,就得在内存中重新加载进程。【参考方案2】:
调用使用 MATLAB Compiler 创建的可执行文件相对于在实时 MATLAB 中调用程序会产生开销,因为它需要启动 MCR。第一次启动时这会更长,但即使在第一次之后仍然会有开销。
如果您不仅可以访问 MATLAB 编译器,还可以访问其中一个 Builder 产品(Builder for .NET 或 - 这可能更好,因为您使用的是 PHP - Builder for Java),那么有一种解决方法.
使用 Builder 产品,您可以创建独立的组件(.NET 程序集或 Java .jar)。然后,您可以创建一个运行的 .NET 或 Java 应用程序,实例化您的 MATLAB 构建的组件(它会启动 MCR),然后坐在那里等待来自您的 PHP 的调用。然后,每个调用都不会受到 MCR 启动开销的影响,并且从 PHP 调用到 .NET/Java 的开销应该小得多。
【讨论】:
感谢 Sam 的回答。是的,我也试过这个。但是我们可以将 .m 文件转换为 mex 文件吗?这个过程会更快还是相同?如果您对从 .m 文件转换为 mex 文件有任何想法,请提出建议。 查看我对您其他问题的回答。 在创建 .Net 程序集时排除一些工具箱会加快进程吗?我制作了一个基于控制台的 C# 应用程序并从 php 调用 exe 任何其他方法吗? 只有一点点 - 它可能会使程序集更小,并且它会更快地构建程序集,但它不会运行得更快。 我怎样才能找出哪些是依赖于我的程序的工具箱。我尝试生成依赖关系报告,但找不到任何其他方法?【参考方案3】:正如其他人所说,当您调用可执行文件时,加载可执行文件时会有(对于 matlab 来说非常大)开销。解决方案?只加载一次。怎么做?这很复杂,并且取决于平台。
我认为最便携的方法是在 matlab 中创建一个服务器(我知道这是可能的,但我从未尝试过)。因此,当您需要使用它时,只需连接到它并发送参数即可。
看看这个:HTTP server in matlab 和这个:http://blogs.mathworks.com/loren/2011/05/27/transferring-data-between-two-computers-using-matlab/
【讨论】:
【参考方案4】:作为对上述所有内容的补充,我建议您设置一个 RAM 驱动器,并将MCR_CACHE_ROOT
系统变量设置为 RAM 驱动器上的一个目录。
这将大大缩短启动时间。
如果有人在桌面上使用此方案,请确保您的 RAM 驱动器在重新启动期间保持不变。
【讨论】:
以上是关于MATLAB 可执行文件太慢的主要内容,如果未能解决你的问题,请参考以下文章
Labview如何生成可执行文件,我用到了Matlab,控制仿真设计,报表工具包,怎么办呀,