2013-05-15 2 views
8

Ho programmato alcune GUI MATLAB (non utilizzando la GUIDA), principalmente per la visualizzazione di immagini e altre semplici operazioni (come la selezione di punti e il tracciamento di alcuni dati dalle immagini).MATLAB: GUI progressivamente sempre più lenta

All'avvio della GUI, tutte le operazioni vengono eseguite rapidamente. Tuttavia, poiché la GUI viene utilizzata (mostrando diversi fotogrammi dai volumi 3D/4D e perfezionando le operazioni sopra menzionate), inizia ad essere progressivamente più lenta, raggiungendo un punto in cui è troppo lenta per un uso comune.

mi piacerebbe sentire qualche contributo per quanto riguarda:

  • possibili strategie per scoprire il motivo per cui l'interfaccia grafica è sempre più lento;
  • Buone pratiche di programmazione GUI MATLAB per evitare questo;
  • Possibili riferimenti che risolvono questi problemi.

Sto usando set/getappdata per salvare le variabili nella figura principale della GUI e comunicare tra le funzioni.

(Vorrei poter fornire un esempio di lavoro minimo, ma non credo che è adatto in questo caso, perché questo accade solo in GUI un po 'più complesse.)

Grazie mille.

EDIT:(Segnalazione di nuovo alcuni reperti utilizzando il profiler :)

ho usato il profiler in due occasioni:

  • subito dopo l'avvio del GUI;
  • dopo aver giocato con esso per un po 'di tempo, finché non ha iniziato a diventare troppo lento.

ho eseguita la stessa procedura esatta in entrambe le operazioni di profilatura, che è stato semplicemente spostando il mouse attorno alla GUI (stesso "percorso" entrambe le volte).

I risultati profiler sono i seguenti:

enter image description here

Sto avendo difficoltà di interpretazione di questi risultati ... Perché è il numero di chiamate di alcune funzioni (come ad esempio impixelinfo) in modo più grande nel secondo caso?

Qualche opinione?

Grazie mille.

+0

Prova questo: forceGarbageCollection(). Questa è una specie di cosa correlata a Java. –

+1

Hai provato a monitorare l'utilizzo della memoria mentre esegui la GUI per periodi prolungati? È in genere molto alto o, ad esempio, aumenta gradualmente nel tempo man mano che la GUI rallenta? Stai usando solo MATLAB o stai chiamando Java o il codice MEXed C da qualche parte? Stai usando variabili MATLAB regolari o stai usando oggetti e, in caso affermativo, valgono o gestiscono oggetti di classe? –

+0

@SamRoberts: No, non ho provato a monitorare l'utilizzo della memoria durante l'esecuzione della GUI. Farà e segnalerà. Per quanto riguarda le altre domande, sto solo usando MATLAB e solo variabili regolari. Grazie. – fnery

risposta

1

Una buona strategia per scoprire perché in Matlab tutto è lento è utilizzare lo profiler.Qui è il modo basilare per usare il profiler:

profile on 
% do stuff now that you want to measure 
profile off 
profile viewer 

Vorrei suggerire profiling una GUI appena aperto, e anche uno che è stato aperto per un po 'ed è notevolmente lento. Quindi confronta i risultati e cerca le funzioni che hanno un aumento significativo in "Tempo auto" o "Tempo totale" per gli indizi su cosa sta causando il rallentamento.

+0

Bene, utilizzo spesso il profiler per gli script regolari, ma usarlo in una GUI mi confonde poiché l'utente stesso può utilizzare una buona quantità di tempo invece del codice di interesse. Questo non renderebbe i tempi meno precisi? – fnery

+0

@fnery I * penso * tutto il tempo di inattività (in attesa che l'utente fornisca un input) sarà associato ad alcune funzioni di livello superiore che probabilmente non ti interessano. Otterrai comunque buone informazioni sulle funzioni di livello inferiore in cui è probabile che si verifichi il problema. – shoelzer

+2

Sono stati trovati alcuni collegamenti utili da MATLAB Central relativi a questo problema: [link1] (http: //blogs.mathworks.it/videos/2013/05/03/accelerazione-up-interfacce utente-in-matlab-con-profiler /) e [link2] (http://blogs.mathworks.com/community/2011/06/28/ speed-up-your-GUI-con-profiling /). – fnery

2

L'unico modo migliore che ho trovato intorno a questo problema è stato accennato sopra: garbage collection forzata. Ottimo consiglio anche se il comando forceGarbageCollection non è riconosciuto in MATLAB. Il comando che vuoi è java.lang.System.gc() ... una tale bestia.

Stavo lavorando a un progetto in cui stavo leggendo 2 porte seriali a 40Hz (usando un timer) e un NIDAQ a 1000Hz (usando startBackground()) e li ho grafici tutti in tempo reale. Le limitazioni di elaborazione parallela di MATLAB garantivano che uno di quei processi causasse una strozzatura del buffer in un dato momento. Le animazioni non sarebbero state in grado di tenere il passo, e alla fine congelare, ecc. Ho ottenuto un certo successo iniziale assicurandomi che stavo definendo un singolo grafico e aggiornando solo i parametri modificati all'interno del mio ciclo di animazione con il comando set. (Ex figure, subplot(311), axis([...]),hold on, p1 = plot(x1,y1,'erasemode','xor',...); ecc allora -.>tic, while (toc<8) set(p1,'xdata',x1,'ydata',y1)...

Utilizzando set renderanno le vostre animazioni molto più veloce e più fluido Tuttavia, si continua a correre nel muro di buffer se animate abbastanza a lungo con troppo in corso in background. - In particolare gli input di dati in tempo reale La garbage collection è la tua risposta.Non è istantanea, quindi non vuoi che esegua ogni ciclo di loop a meno che il tuo ciclo sia estremamente lungo.La mia soluzione è impostare una variabile contatore al di fuori del while loop e usa una funzione mod in modo che esegua solo tutti i cicli 'n' (ad esempio counter = 0; while()... counter++; if (~mod(counter,n)) java.lang.System.gc(); e così via.

Ciò consentirà di risparmiare (e speriamo gli altri) un sacco di tempo e mal di testa, fidati di me e lo farai avere MATLAB in esecuzione dati in tempo reale acq e animazione alla pari con LabVIEW.