2013-04-12 477 views
22

我使用Matlab中的deploytool将我的Matlab程序转换为基于控制台的应用程序。 Matlab .m文件需要大约2秒钟才能执行,但在将其转换为可执行文件并称为.exe后,需要45秒才能执行,这太长了。Matlab执行速度太慢

我想将Matlab程序与PHP集成。有没有其他有效和快速的方法来做到这一点?在我的项目中,时间确实是一个很重要的因素(不是开发时间,而是应用程序的执行时间)。那么有没有什么方法花费更少的时间?

我在互联网上看到,我们可以编写PHP扩展来调用Matlab。这种方法是快速还是相同调用.exe文件? Matlab编码器对这个过程有什么帮助?如果有其他选择,请提及它。

+0

有一件事是跟踪实际的计算时间。至少您可以确定通话是否较慢或计算本身。 –

+0

我该如何追踪?我使用了跑步和时间,但它只是给出了总时间。 – user1583647

+0

matlab的.m文件只需要2秒的时间来执行,但exe文件需要我提到45秒,所以它是缓慢的调用? – user1583647

回答

15

编译的.exe将开销遭受的第一次运行它,原因是其开始的MCR一个MATLAB:除非你注销或重新启动操作系统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

+0

编写编译应用程序的最佳做法是开发它们,以便它们可以在不经常重新启动的情况下运行。也就是说,您可以尝试设计您的应用程序,以便在绝对必要时不会退出。这样MCR就不需要经常被初始化。但我怎么能做到这一点? – user1583647

+5

除非您注销或重新启动操作系统,否则MCR将保持预加载状态。另一个有用的阅读:[加速编译的应用程序启动](http://undocumentedmatlab.com/blog/speeding-up-compiled-apps-startup/) – Oleg

+0

我试着连续执行exe文件,但没有及时更改 – user1583647

7

调用使用MATLAB Compiler创建的可执行文件相对于在实时MATLAB中调用该程序而言将承受相当的开销,因为它需要启动MCR。第一次启动它会更长,但即使在第一次后仍会有开销。

如果您不仅可以访问MATLAB Compiler,还可以访问其中一个Builder产品(Builder for .NET或 - 因为您使用PHP-Builder for Java可能会更好),所以有一种解决方法这个。

使用Builder产品,您可以创建独立组件(.NET程序集或Java .jar)。然后,您可以创建一个将运行的.NET或Java应用程序,实例化您的MATLAB构建的组件(启动MCR),然后坐在那里等待PHP的调用。然后每个调用都不会遭受MCR启动开销,并且应该只有从PHP调用到.NET/Java的开销要小得多。

+0

感谢Sam的回答。是的,我也试过了。但是,我们可以将.m文件转换为mex文件,这个过程会更快还是相同?如果您对从.m转换为mex文件有任何想法,请建议。 – user1583647

+0

请参阅我对您的其他问题的回答。 –

+0

在创建一个.Net程序集的时候会排除一些工具箱加速进程的技巧吗?我做了一个基于控制台的C#应用​​程序,并且调用了其他任何要执行的方法来执行php程序? – user1583647

1

正如其他人所说,当你调用可执行文件时,在可执行文件加载时会有一个(对于matlab来说真的很大)开销。解决方案?只加载一次。怎么做?这很复杂,取决于平台。

我认为最简单的方法就是在matlab中创建一个服务器(我知道这是可能的,但我从未尝试过)。所以当你需要使用它时,你只需连接它并发送参数。

看看这个:HTTP server in matlab和这样的:你可能想要做http://blogs.mathworks.com/loren/2011/05/27/transferring-data-between-two-computers-using-matlab/