Strumenti di profilazione Delphi

Sto avendo alcuni problemi di prestazioni con la mia app Delphi 2006. Puoi suggerire eventuali strumenti di profilazione che mi aiuteranno a trovare il collo della bottiglia

cioè uno strumento come il turbo Profiler

Ho fatto la stessa domanda non molto tempo fa

Ho scaricato e provato AQtime. Sembra completo, ma non è uno strumento facile da usare ed è MOLTO costoso per un programmatore individuale (ad esempio $ 600 US). Mi è piaciuto il fatto che non fosse invasivo (non ha modificato il tuo codice) e che potesse eseguire il profiling line-by-line, fino a quando ho scoperto che, essendo un profiler di strumentazione, può portare a ottimizzazioni improprie come in: Perché CharInSet è più veloce di un’istruzione Case?

Ho provato una demo di ProDelphi, molto meno costosa (circa 80 dollari credo), ma per me era troppo goffo – non mi piaceva affatto l’interfaccia utente, ed è invasiva – cambiando il codice per aggiungere la strumentazione, di cui bisogna stare attenti.

Ho usato GpProfile con Delphi 4 per molti anni. Lo amavo. Era anche invasivo, ma ha funzionato così bene che ho imparato a fidarmi e non mi ha mai dato problemi in 10 anni. Ma quando ho aggiornato a Delphi 2009, non ho pensato che fosse meglio provare a usarlo, dal momento che non è stato aggiornato e, per ammissione del GP, non funzionerà senza modifiche. Mi aspetto che non sarai in grado di usarlo neanche con Delphi 2006.

ProDelphi e GpProfile eseguiranno il profilo solo a livello di procedura. Se si desidera eseguire singole righe (che talvolta ho dovuto), è necessario chiamare PROC1, PROC2, PROC3 per ogni riga e inserire una riga in ogni PROC. È stato un po ‘fastidioso doverlo fare, ma mi ha dato dei buoni risultati (almeno sono stato contento dei risultati ottenuti da GpProfile).

La risposta che ho accettato nella mia domanda su CharInSet diceva che “I profiler per il campionamento, che controllano periodicamente la posizione della CPU, sono solitamente migliori per misurare il tempo del codice.” e una risposta successiva ha fornito a Delphi il profiler gratuito di campionamento di Eric Grange per Delphi che ora supporta Delphi 2009. Non l’ho ancora provato, ma ne ho sentito parlare bene, ed è il prossimo che proverò.

Tra l’altro, potresti essere migliore risparmiando i tuoi $ 600 NON comprando AQtime e utilizzandoli invece per aggiornare Delphi 2006 a Delphi 2009. La stabilità, la velocità e le funzionalità extra (in particolare Unicode), varrà la pena. Vedi: Quali sono i principali incentivi per l’aggiornamento a D2009 (escluso Unicode)?

Inoltre AQtime non si integra ancora con Delphi 2009.

Un altro libero, con la fonte che ho scoperto, ma non ho ancora provato è TProfiler . Se qualcuno ha provato quello, mi piacerebbe sapere cosa ne pensano.


Nota: l’addenum che ho aggiunto in seguito alla domanda 291631 sembra che possa essere la risposta. Vedi il programma open source di Andre: asmprofiler


Febbraio 2010 followup. Ho morso il proiettile e ho acquistato AQTime. Alcuni mesi fa l’hanno finalmente integrato in Delphi 2009, che è quello che uso (ma devono ancora fare Delphi 2010). La visione delle linee di origine e dei loro singoli tempi e conteggi è inestimabile per me, e AQTime svolge un ottimo lavoro.

Ho appena trovato un simpatico profiler di campionamento gratuito e supporta Delphi 2009

Ho usato ProDelphi, principalmente per determinare quali routine stanno mangiando la maggior parte del tempo. È un Instrumenting Profiler, il che significa aggiungere un po ‘di codice all’inizio e alla fine di ogni routine. Tu controlli quali routine i profili per direttive all’interno dei commenti. Puoi anche profilare sezioni di una routine. Ma le sezioni devono avviarsi e fermarsi allo stesso livello di blocco, senza entrare o uscire dalla sezione. L’ottimizzazione deve essere distriggersta dove ProDelphi inserisce il codice (dove si inseriscono le direttive), ma è ansible accenderlo da qualsiasi altra parte.

L’interfaccia è un po ‘klunky, ma molto veloce una volta capito. Puoi fare un lavoro utile con la versione gratuita (limitato a 10 routine o sezioni). ProDelphi può dirti rapidamente quali routine dovresti esaminare. Ma non perché, o quali linee.

Di recente, ho iniziato a utilizzare VTune Performance Analyzer di Intel. ‘WOW’ non inizia a riassumere. Sono impressionato Semplicemente non avevo idea che tutto questo fosse stato integrato nei moderni processori Intel. Sapevi che può dirti esattamente quanto spesso una singola istruzione deve aspettare che la L1 Data Cache guardi di lato su un altro core prima di ricaricare una parola da una cache più alta? Se continuo a scrivere, sembrerò una pubblicità senza fiato per il prodotto.

Vai su Intel e scarica la demo a tempo pieno. Scava in rete e trova un paio di video su come iniziare. (Altrimenti, corri il rischio di essere ostacolato da tutte le opzioni.) Funziona con qualsiasi compilatore. Basta puntarlo su un .exe. Ti mostrerà le linee di origine se il tuo .exe include le informazioni di debug e lo punti al codice sorgente.


Ero bloccato cercando di ottimizzare un ciclo interno che chiamava una funzione che ho scritto. Non ci sono state chiamate esterne tranne length (str). Questo ciclo interno ha funzionato miliardi di volte per sessione e ha consumato circa la metà della CPU – un candidato perfetto per l’ottimizzazione. Ho provato tutti i tipi di ottimizzazioni standard, con poco o nessun effetto. VTune mostra hot-spot. Ho appena eseguito il drill down fino a quando non mi ha mostrato l’ASM generato dal mio codice e quanto tempo ogni istruzione ha preso.

Ecco cosa mi ha detto VTune:

  • linea nnnn [linea del codice delphi] …
  • addr hhhh cmp byte ptr [edx + ecx], 0x14h – – – – – – – – 3 cicli
  • addr hhhh ja label_x – – – – – – – – – – – – – – – – – – -10302 cicli

I valori assoluti non significano nulla. (Penso che stavo misurando i cicli per istruzione ritirata.) I valori relativi rendono chiaro dove è andato tutto il tempo. La cosa grandiosa era la finestra dei consigli. Mi ha detto che il codice si è bloccato in attesa che i dati si caricassero nella cache dei dati L1 e in realtà mi ha dato buoni consigli su come evitare le bancarelle.

Il mio errore era pensare al Core2 Quad come a una CPU 8086 veramente veloce. No ^ 3. Il codice stava spendendo il 99% del suo tempo in attesa che i dati si caricassero dalla memoria perché stavo saltando troppo. Il mio algoritmo presupponeva che la memoria fosse RAM (accesso casuale). Non è così che funzionano le moderne CPU. È ansible accedere ai dati nella cache L1 in 1 o 2 cicli, ma l’accesso alla cache L2 o L3 costa da decine a centinaia di cicli e passare alla RAM costa migliaia. Tuttavia , tutta questa latenza viene evitata quando si accede ai dati in sequenza, poiché il processore precaricherà la cache con i dati che seguono il primo byte richiesto.

Il risultato netto è che ho riscritto l’algoritmo per accedere ai dati in modo più sequenziale e ho ottenuto un 10x di accelerazione, che è stato abbastanza buono. Quando avrò il tempo, sono sicuro di poterne ricavare altri 10x. Ma questo è solo il Geek in me. Abbastanza buono è abbastanza buono.

Sapevo già di ottenere il massimo dall’ottimizzazione del tuo algoritmo, non del tuo codice. Pensavo che mi servisse solo il profiler per dirmi cosa occorreva ottimizzare. Ma avevo anche bisogno di trovare il motivo del collo di bottiglia in modo da poter progettare un algoritmo più veloce.

Il nuovo algoritmo non è radicalmente diverso dal vecchio. Memorizza semplicemente i dati in modo tale che sia ansible accedervi in ​​modo sequenziale. Ad esempio, in un punto ho spostato un campo da una serie di record nel proprio array di numeri interi, perché il ciclo interno non aveva bisogno del resto dei dati in ogni record. Ho anche avuto una matrice rettangular memorizzata come una matrice dynamic di array dinamici. Il codice utilizzato per accedere in modo casuale a megabyte di dati (e la cache di dati L1 scarsa è solo 64 KB). Ho capito come conservarlo in un array lineare come diagonale della matrice, che è l’ordine in cui utilizzo i dati. (OK, forse quella parte è radicale.)

Ad ogni modo, sono venduto su VTune.

Ho usato http://www.prodelphi.de con successo sul progetto Delphi 7 in passato. Economico e funziona. Non lasciare che il sito web di Bush League ti spaventi.

http://www.AutomatedQA.com ha la scelta migliore per Delphi profiling (AQTime)

Io uso e raccomando Sampling Profiler, penso che tu possa ottenerlo da embarcadeiro.public, newsgroup degli allegati.

Ecco un’altra scelta, non ho usato questo prima: http://www.prodelphi.de

Scelta finale che conosco per Delphi, http://gp.17slon.com/gpprofile/index.htm

Nota finale, http://www.torry.net è un ottimo posto per la ricerca di componenti / strumenti Delphi