2009-10-28 8 views
5

Abbiamo un'applicazione che è mista .NET 2.0 e nativo C++. Nei nostri test, abbiamo una modalità che può scorrere automaticamente una serie di progetti. Un progetto si apre, corre, chiude, ripete. Ognuno di questi passaggi richiede la creazione/distruzione di Windows (Winforms per essere precisi). Recentemente abbiamo riscontrato alcuni strani comportamenti nelle prestazioni. Dopo aver funzionato per alcune ore, le parti di apertura e chiusura rallentano (bloccando il filo dell'interfaccia grafica e mostrando schermate semitranate, ecc.). Ora sarebbe facile bloccarlo fino a una perdita di risorse ... ma stiamo monitorando maniglie e memoria, e mentre la memoria cresce leggermente non c'è nulla che indichi questo livello di problema. Le maniglie sono stabili Quindi forse gestori di eventi penzoloni ... hanno ancora bisogno di indagare su questo. Ma il kicker, che mi lascia perplesso, è che chiudere l'applicazione e riavviarlo non porta indietro le prestazioni iniziali. È ancora lento fino a quando non riavvio il sistema operativo (vinci XP) e quindi le prestazioni iniziano di nuovo scattanti. Questo mi lascia davvero perplesso mentre presumo che la chiusura dell'applicazione richieda tutte le risorse. qualche idea?Degrado delle prestazioni dispari nell'applicazione

+0

Dovresti eseguire l'app sotto il profiler prima e dopo il rallentamento e confrontare i due risultati. Tutto ciò che spicca per essere drasticamente diverso vale la pena investigare. Esistono molti profiler gratuiti, buoni o gratuiti e buoni, basta provarne alcuni e sceglierne uno con cui ti trovi bene. – Rom

risposta

0

Stavamo perdendo classi di finestre

1

Sembra una possibile perdita di handle GDI. GDI objects non vengono raccolti automaticamente dal Garbage Collector.

.NET Memory Profiler (http://memprofiler.com/) fa un buon lavoro di tracciamento di questi (c'è una versione di prova di 14 giorni).

Hai visto questi:

+0

Aggiungerò l'utilizzo di Memory Profiler. Ti consente di scattare istantanee e confrontarle, in modo da poter scattare un'istantanea su una singola iterazione, prenderne un'altra sulla successiva e differirle: puoi vedere esattamente ciò che sta crescendo tra le iterazioni comuni della tua app. – stusmith

+0

Possiedo .NET Memory Profiler e proverò a farlo, ma il fatto che il riavvio dell'applicazione (senza riavvio) non risolva il problema non verrà spiegato da alcunché nella crescita del processo. – user109078

+0

Questo non è vero per alcune risorse di sistema limitate come gli handle GDI .... –

0

Si presume che sia una perdita di risorse (che non è una cattiva ipotesi), ma potrebbe essere qualcos'altro.

Hai provato a utilizzare un profiler delle prestazioni?

Problemi correlati