2013-04-12 17 views
22

Ho convertito il mio programma Matlab in un'applicazione basata console utilizzando il deploytool in Matlab. Il file Matlab .m impiega circa 2 secondi per essere eseguito, ma dopo averlo convertito in un file eseguibile e chiamato .exe, occorrono 45 secondi per l'esecuzione, che è troppo lungo.Matlab eseguibile troppo lento

Voglio integrare il programma Matlab con PHP. C'è un altro modo efficiente e veloce per fare questo? Nel mio progetto, il tempo è davvero un fattore importante (non il tempo di sviluppo ma il tempo di esecuzione dell'applicazione). Quindi ci sono metodi che richiedono meno tempo?

ho visto su Internet che, possiamo scrivere estensioni PHP per chiamare il Matlab. Questo metodo è veloce o uguale al chiamare il file .exe? Il codificatore Matlab è di aiuto per questo processo? Se c'è qualche opzione alternativa, per favore menzionala.

+0

Una cosa che si consiglia di fare è tenere traccia del tempo di calcolo effettivo. Almeno puoi quindi stabilire se la chiamata è più lenta o il calcolo stesso. –

+0

come posso rintracciarlo? Ho usato la corsa e il tempo, ma dà solo il tempo totale. – user1583647

+0

il file matlab .m richiede solo 2 secondi per l'esecuzione, ma l'exe prende come detto 45 secondi quindi è la chiamata che è lenta? – user1583647

risposta

15

A MATLAB compilati exe soffrirà in testa alla prima volta che lo si esegue becuase sta iniziando l'MCR: Why does my application compiled with the MATLAB Compiler 4.1 take a long time to start up?

A meno che non si disconnette o si riavvia il sistema operativo, il MCR rimarrà pre-caricato. Un'altra lettura utile: Speeding up compiled apps startup.

"Why does my stand-alone created using the MATLAB Compiler take longer to start the first time?" segnala inoltre che le esecuzioni consecutive dovrebbero essere più veloci, ma se si ritorna in un secondo momento, sarà necessario ricaricare il processo in memoria.

È possibile allegare il codice entro tic toc, distribuirlo e verificare il tempo di esecuzione, rispetto al sovraccarico di avvio.

L'alternativa ad accelerare il .exe sarebbe chiamare MATLAB con PHP. Se si mantiene aperta la sessione MATLAB, si esegue una volta l'overhead. È possibile avviare MATLAB all'avvio, evitando così di soffrire il sovraccarico in particolare durante la chiamata con PHP.

Per ulteriori informazioni leggere Calling MATLAB from PHP e tenere presente che non si desidera utilizzare exit se non specificamente necessario.

+0

Una best practice per la scrittura di applicazioni compilate è di svilupparle in modo che possano essere eseguite senza essere riavviate spesso. Cioè, puoi provare a progettare la tua applicazione in modo che non esca se non assolutamente necessario. In questo modo l'MCR non dovrà essere inizializzato spesso. Ma come posso ottenere questo? – user1583647

+5

A meno che non si disconnetta o si riavvii il sistema operativo, l'MCR rimarrà precaricato. Un'altra utile lettura: [Accelerazione dell'avvio di app compilate] (http://undocumentedmatlab.com/blog/speeding-up-compiled-apps-startup/) – Oleg

+0

Ho provato ad eseguire il file exe in modo continuo ma senza modifiche nel tempo – user1583647

7

Chiamare un eseguibile creato con MATLAB Compiler risentirà di un sovraccarico relativo alla chiamata del programma all'interno di MATLAB dal vivo, in quanto è necessario avviare l'MCR. Questo sarà più lungo la prima volta che lo avvii, ma ci sarà ancora un sovraccarico anche dopo la prima volta.

Se si ha accesso non solo al compilatore MATLAB, ma a uno dei prodotti Builder (Builder per .NET o - che è probabilmente meglio da quando si utilizza PHP - Builder per Java) c'è un modo di lavorare in giro Questo.

Utilizzando i prodotti Builder è possibile creare un componente autonomo (o un assembly .NET o un .jar Java). È quindi possibile creare un'applicazione .NET o Java che verrà eseguita, creare un'istanza del componente generato da MATLAB, che avvia l'MCR, quindi sedersi e attendere una chiamata dal PHP. Ogni chiamata non subirà affatto l'overhead di avvio del MCR e dovrebbe avere solo un overhead molto più piccolo dalla chiamata da PHP a .NET/Java.

+0

Grazie Sam per la risposta. Sì, ho provato anche questo. Ma possiamo convertire il file .m in file mex questo processo sarà più veloce o lo stesso? Se hai qualche idea sulla conversione da file .m a mex, ti preghiamo di suggerire. – user1583647

+0

Vedi la mia risposta alla tua altra domanda. –

+0

L'esclusione di alcuni toolbox durante la creazione di un assembly .Net velocizza il processo abit? Ho creato un'applicazione C# basata su console e ho chiamato l'exe da php per altri metodi? – user1583647

1

Come altri hanno detto, quando si chiama gli eseguibili, c'è una (davvero grande per Matlab) in testa quando l'eseguibile viene caricato. La soluzione? Caricalo solo una volta. Come farlo? È complicato e dipende dalle piattaforme.

Penso che il modo più portabile per fare qualcosa di simile è creare un server in matlab (so che è possibile, ma non l'ho mai provato). Quindi quando hai bisogno di usarlo, ti connetti semplicemente ad esso e invii gli argomenti.

Date un'occhiata a questo: HTTP server in matlab e questo: http://blogs.mathworks.com/loren/2011/05/27/transferring-data-between-two-computers-using-matlab/

Problemi correlati