Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MATLAB可执行文件太慢_Php_C_Matlab_Exe_Matlab Deployment - Fatal编程技术网

Php MATLAB可执行文件太慢

Php MATLAB可执行文件太慢,php,c,matlab,exe,matlab-deployment,Php,C,Matlab,Exe,Matlab Deployment,我使用MATLAB中的deploytool将MATLAB程序转换为基于控制台的应用程序。MATLAB.m文件执行大约需要2秒,但在我将其转换为可执行文件并调用.exe后,执行需要45秒,这太长了 我想将MATLAB程序与PHP集成。有没有另一种高效快捷的方法?在我的项目中,时间确实是一个很大的因素(不是开发时间,而是应用程序的执行时间)。那么有没有一种花费更少时间的方法呢 我在网上看到,我们可以编写PHP扩展来调用MATLAB。此方法是快速的还是与调用.exe文件相同?MATLAB编码器对这个过

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

我想将MATLAB程序与PHP集成。有没有另一种高效快捷的方法?在我的项目中,时间确实是一个很大的因素(不是开发时间,而是应用程序的执行时间)。那么有没有一种花费更少时间的方法呢


我在网上看到,我们可以编写PHP扩展来调用MATLAB。此方法是快速的还是与调用
.exe
文件相同?MATLAB编码器对这个过程有帮助吗?如果有替代选项,请提及。

MATLAB编译的.exe在您第一次运行时会出现开销,因为它正在启动MCR:


除非您注销或重新启动操作系统,否则MCR将保持预加载状态。另一个有用的阅读:

“”还报告连续运行应该更快,但如果以后重新运行,则必须在内存中重新加载进程

您可以将代码封装在
tictoc
中,部署它,并根据启动开销检查执行所花费的时间

加速
.exe
的另一种方法是使用PHP调用MATLAB。如果保持MATLAB会话打开,则会有一次开销。您可以在启动时启动MATLAB,从而避免特别是在使用PHP调用时遭受开销


如需了解更多信息,请阅读,并记住,除非特别需要,否则您不想使用
exit

调用使用MATLAB编译器创建的可执行文件与在live MATLAB中调用程序相比,会有一定的开销,因为它需要启动MCR。这将是较长的第一次启动它,但仍将有一个开销,即使在第一次之后

如果您不仅可以访问MATLAB编译器,还可以访问其中一个Builder产品(Builder for.NET或-这可能更好,因为您使用的是PHP-Builder for Java),那么有一种方法可以解决这个问题


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

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

我认为做类似事情的最可移植的方法是在matlab中创建一个服务器(我知道这是可能的,但我从未尝试过)。因此,当您需要使用它时,只需连接到它并发送参数


看看这个:

除了上面所说的,我建议设置一个RAM驱动器,并将
MCR\u CACHE\u ROOT
系统变量设置为RAM驱动器上的目录

这将大大缩短启动时间


如果有人在桌面上使用此方案,请确保您的RAM驱动器在重新启动期间是持久的

您可能要做的一件事是跟踪实际计算时间。至少你可以确定通话是慢还是计算本身慢。我如何跟踪?我使用了run和time,但它只给出了总时间。matlab.m文件只需要2秒执行,但exe需要45秒,所以调用速度慢吗?可能,但不一定,因为可能有不同的输入/条件。我通常使用
tic
toc
来记录时间差。是的,exe和.m文件中代码的执行时间略有不同。对于.m文件:运行时间为1.661620秒。运行时间为0.004483秒。对于两个进程。对于exe文件,运行时间为2.610610秒。运行时间是0.021953秒。对于相同的两个进程。但是exe的总执行时间是40秒,所以我认为调用exe需要时间。解决这个问题的办法是什么?编写编译后的应用程序的最佳实践是开发它们,这样它们就可以在不经常重启的情况下运行。也就是说,您可以尝试设计应用程序,使其不会退出,除非绝对必要。这样,MCR就不需要经常初始化。但我如何才能做到这一点?除非您注销或重新启动操作系统,否则MCR将保持预加载状态。另一个有用的读物:我试着不间断地执行exe文件,但时间没有改变。虽然你的答案的内容是正确的,但我不认为它回答了这个问题。我假设你通过设置
MCR\u CACHE\u ROOT
(我之前评论中的链接)没有得到任何改进?技术解决方案“”还报告说,连续运行应该更快,但如果以后重新运行,则必须将进程重新加载到内存中。感谢Sam的回答。是的,我也尝试过。但是,我们可以将.m文件转换为mex文件吗?这个过程会更快还是相同?如果你对从.m文件转换为mex文件有任何想法,请提出建议。请参阅我对你的其他问题的回答。在创建.Net程序集时排除一些工具箱会加快进程吗?我制作了一个基于控制台的C#应用程序,并从php any调用了exe其他方法可以做吗?只有一点点-它可能会使程序集变小,生成程序集的速度更快,但运行速度不会快很多。我如何找出哪些工具箱依赖于我的程序。我尝试生成依赖关系报告,但找不到其他方法?