Изпълнимият файл на 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 секунди. за два процеса. За exe файла изминалото време е 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
Опитах се да изпълнявам exe файла непрекъснато, но без промяна във времето - person user1583647; 12.04.2013
comment
Въпреки че съдържанието на вашия отговор е правилно, не мисля, че отговаря на въпроса. - person Dennis Jaheruddin; 12.04.2013
comment
@user1583647 опитахте ли да засечете времето за изпълнение на кода в .exe с tic toc? - person Oleg; 13.04.2013
comment
Да, времето за изпълнение на кода в exe и .m файла е малко по-различно. За .m файла: изминалото време е 1,661620 секунди. Изминалото време е 0,004483 секунди. за два процеса. За exe файла изминалото време е 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 асембли ще ускори ли малко процеса? Направих конзолно базирано C# приложение и извиках exe от php, има ли други методи, които да направя? - 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) натоварване, когато изпълнимият файл се зареди. Решението? Заредете го само веднъж. Как да го направим? Сложно е и зависи от платформите.

Мисля, че най-преносимият начин да направите нещо подобно е да направите сървър в matlab (знам, че това е възможно, но никога не съм опитвал). Така че, когато трябва да го използвате, просто се свързвате с него и изпращате аргументите.

Разгледайте това: HTTP сървър в matlab и това: http://blogs.mathworks.com/loren/2011/05/27/transferring-data-between-two-computers-using-matlab/

person fstamour    schedule 23.04.2013

Само като допълнение към всичко казано по-горе, мога ли да предложа настройка на RAM устройство и задаване на MCR_CACHE_ROOT системна променлива в директория на RAM устройство.

Това значително ще подобри по-нататъшното време за стартиране.

Уверете се, че вашето RAM устройство е постоянно по време на рестартиране, ако някой използва тази схема на настолен компютър.

person simon    schedule 02.04.2020