Исполняемый файл MATLAB работает слишком медленно

Я преобразовал свою программу MATLAB в консольное приложение, используя deploytool в MATLAB. Выполнение файла MATLAB .m занимает около 2 секунд, но после того, как я преобразовал его в исполняемый файл и вызвал .exe, для его выполнения требуется 45 секунд, что слишком долго.

Я хочу интегрировать программу MATLAB с PHP. Есть ли другой эффективный и быстрый способ сделать это? В моем проекте время действительно является важным фактором (не время разработки, а время выполнения приложения). Так есть ли метод, который занимает меньше времени?

Я видел в Интернете, что мы можем написать расширения PHP для вызова MATLAB. Является ли этот метод быстрым или таким же, как вызов файла .exe? Кодер MATLAB может помочь в этом процессе? Если есть альтернативный вариант, укажите его.


person user1583647    schedule 12.04.2013    source источник
comment
Одна вещь, которую вы можете сделать, это отслеживать фактическое время расчета. По крайней мере, вы можете тогда точно определить, медленнее ли вызов или сам расчет.   -  person Dennis Jaheruddin    schedule 12.04.2013
comment
как я могу это отследить? Я использовал пробег и время, но это просто дает общее время.   -  person user1583647    schedule 12.04.2013
comment
файл matlab .m выполняется всего за 2 секунды, но exe занимает, как я упоминаю, 45 секунд, так что это медленный вызов?   -  person user1583647    schedule 12.04.2013
comment
Вероятно, но не обязательно, так как могут быть разные входы/условия. Я обычно использую tic и toc для записи разницы во времени.   -  person Dennis Jaheruddin    schedule 12.04.2013
comment
Да, время выполнения кода в exe-файле и в .m-файле немного отличается. Для .m-файла: прошедшее время составляет 1,661620 секунд. Прошедшее время составляет 0,004483 секунды. Для двух процессов. Для исполняемого файла Истекшее время составляет 2,610610 секунд. Прошедшее время составляет 0,021953 секунды для тех же двух процессов. Но общее время выполнения exe составляет 40 секунд, поэтому я думаю, что для вызова exe требуется время. Что может быть решением для этого?   -  person user1583647    schedule 16.04.2013
comment
Не могли бы вы попробовать две вещи? - Деактивируйте брандмауэр - Запустите .exe от имени администратора (щелкните правой кнопкой мыши по значку)   -  person tashuhka    schedule 16.04.2013
comment
Какую версию MATLAB вы используете?   -  person Oleg    schedule 19.04.2013
comment
Может ли кто-нибудь объяснить мне, как пользователь с репутацией 49 может предложить награду в 50 баллов?   -  person Floris    schedule 22.04.2013


Ответы (4)


Скомпилированный в MATLAB файл .exe будет страдать от накладных расходов при первом запуске, потому что он запускает MCR: Почему мое приложение, скомпилированное с помощью MATLAB Compiler 4.1, занимает много времени пора начинать?

Если вы не выйдете из системы или не перезапустите ОС, MCR останется предварительно загруженным. Еще одно полезное чтение: Ускорение запуска скомпилированных приложений.

"Почему моя позиция -alone, созданный с помощью компилятора MATLAB, занимает больше времени для запуска в первый раз?" также сообщает, что последовательные запуски должны быть быстрее, но если вы повторно запустите позже, вам придется перезагрузить процесс в памяти.

Вы можете поместить свой код в tic toc, развернуть его и проверить, сколько времени занимает выполнение с учетом накладных расходов при запуске.

Альтернативой ускорению .exe может быть вызов MATLAB с PHP. Если вы оставите сеанс MATLAB открытым, вы столкнетесь с накладными расходами один раз. Вы можете запускать MATLAB при запуске, избегая тем самым накладных расходов, особенно во время вызова с PHP.

Для получения дополнительной информации прочитайте Вызов MATLAB из PHP и помните, что вы не хочу использовать exit, если в этом нет особой необходимости.

person Oleg    schedule 12.04.2013
comment
Лучшей практикой написания скомпилированных приложений является разработка их таким образом, чтобы они могли работать без частого перезапуска. То есть вы можете попытаться спроектировать свое приложение так, чтобы оно не закрывалось без крайней необходимости. Таким образом, MCR не нужно будет часто инициализировать. Но как я могу этого добиться? - person user1583647; 12.04.2013
comment
Если вы не выйдете из системы или не перезапустите ОС, MCR останется предварительно загруженным. Еще одно полезное чтение: Ускорение запуска скомпилированных приложений - person Oleg; 12.04.2013
comment
Я пытался запускать исполняемый файл непрерывно, но без изменений во времени. - person user1583647; 12.04.2013
comment
Хотя содержание вашего ответа верно, я не думаю, что оно отвечает на вопрос. - person Dennis Jaheruddin; 12.04.2013
comment
@user1583647 user1583647 Вы пытались синхронизировать выполнение кода в .exe с помощью тик-так? - person Oleg; 13.04.2013
comment
Да, время выполнения кода в exe-файле и в .m-файле немного отличается. Для .m-файла: прошедшее время составляет 1,661620 секунд. Прошедшее время составляет 0,004483 секунды. Для двух процессов. Для исполняемого файла Истекшее время составляет 2,610610 секунд. Прошедшее время составляет 0,021953 секунды для тех же двух процессов. Но общее время выполнения exe составляет 40 секунд, поэтому я думаю, что для вызова exe требуется время. Что может быть решением для этого? - person user1583647; 16.04.2013
comment
Я предполагаю, что вы не получили никаких улучшений, установив MCR_CACHE_ROOT (ссылка в моем предыдущем комментарии)? Техническое решение Почему мой автономный процесс, созданный с помощью компилятора MATLAB, занимает больше времени для запуска в первый раз? также сообщает, что последовательные запуски должны быть быстрее, но если вы повторно запустите позже, вам придется перезагрузить процесс в памяти. - person Oleg; 16.04.2013
comment
Ссылка на Calling MATLAB from PHP не работает - person Dennis Jaheruddin; 26.07.2013

Вызов исполняемого файла, созданного с помощью компилятора MATLAB, повлечет за собой накладные расходы по сравнению с вызовом программы в реальном MATLAB, поскольку ему необходимо запустить MCR. Это будет дольше при первом запуске, но все равно будут накладные расходы даже после первого раза.

Если у вас есть доступ не только к MATLAB Compiler, но и к одному из продуктов Builder (Builder для .NET или, что, вероятно, лучше, поскольку вы используете PHP, Builder для Java), есть способ обойти это.

Используя продукты Builder, вы можете создать автономный компонент (либо сборку .NET, либо Java .jar). Затем вы можете создать приложение .NET или Java, которое будет работать, создать экземпляр вашего компонента, созданного в MATLAB, который запускает MCR, а затем сидеть и ждать вызова от вашего PHP. В этом случае каждый вызов вообще не будет страдать от накладных расходов при запуске MCR и должен иметь гораздо меньшие накладные расходы по сравнению с вызовом из PHP в .NET/Java.

person Sam Roberts    schedule 17.04.2013
comment
Спасибо, Сэм, за ответ. Да, я тоже пробовал. Но можем ли мы преобразовать файл .m в файл MEX, будет ли этот процесс быстрее или таким же? Если у вас есть какие-либо идеи о преобразовании файлов .m в файлы MEX, пожалуйста, предложите. - person user1583647; 18.04.2013
comment
Смотрите мой ответ на другой ваш вопрос. - person Sam Roberts; 18.04.2013
comment
Ускорит ли процесс исключение некоторого набора инструментов при создании сборки .Net? - person user1583647; 19.04.2013
comment
Только немного - это потенциально уменьшит сборку и ускорит ее сборку, но она не будет работать намного быстрее. - person Sam Roberts; 19.04.2013
comment
как я могу узнать, какие инструменты зависят от моей программы. Я попытался создать отчет о зависимостях, но не могу найти другого метода? - person user1583647; 19.04.2013
comment
Помимо того, что вы просто знаете, потому что вы его написали, или просматриваете и вручную ищете все зависимости, отчет о зависимостях является правильным методом. Вы можете сделать то же самое с помощью команды depfun. - person Sam Roberts; 19.04.2013

Как говорили другие, когда вы вызываете исполняемые файлы, при загрузке исполняемого файла возникают (действительно большие для Matlab) накладные расходы. Решение? Загрузите его только один раз. Как это сделать? Это сложно и зависит от платформы.

Я думаю, что самый портативный способ сделать что-то подобное - сделать сервер в матлабе (я знаю, что это возможно, но я никогда не пробовал). Поэтому, когда вам нужно его использовать, вы просто подключаетесь к нему и отправляете аргументы.

Взгляните на это: HTTP-сервер в Matlab и на это: http://blogs.mathworks.com/loren/2011/05/27/передача-данных-между-двумя-компьютерами-использованием-matlab/

person fstamour    schedule 23.04.2013

В дополнение ко всему сказанному выше, могу ли я предложить настроить RAM-диск и установить системную переменную MCR_CACHE_ROOT в каталог на RAM-диске.

Это значительно улучшит дальнейшее время запуска.

Убедитесь, что ваш RAM-диск постоянен во время перезагрузки, если кто-то использует эту схему на рабочем столе.

person simon    schedule 02.04.2020