Domanda

A cosa servono le funzioni o le procedure integrate in Delphi (in particolare v2010 qui, ma ho avuto lo stesso problema con Turbo Delphi)?

C'è qualche discalimer nella guida in merito che potrebbe non sempre incorporare una funzione a causa di "determinati criteri" qualunque cosa significhi.

Ma ho scoperto che le funzioni generalmente in linea (anche quelle molto semplici con 3 o 4 righe di codice) rallentano il codice anziché accelerarlo.

Un'ottima idea sarebbe un'opzione del compilatore per "incorporare tutto". Non mi importa se il mio exe cresce del 50% o giù di lì per farlo funzionare più velocemente.

Esiste un modo in cui posso forzare Delphi a incorporare veramente il codice anche se non viene deciso di essere inserito dal compilatore? Sarebbe davvero d'aiuto. Altrimenti devi fare "allineamento manuale" di replicare il codice di procedura in più aree del codice con commenti come " // inline non riuscito qui, quindi se modifichi le 5 righe successive, modificale negli altri 8 punti duplicati questo codice esiste "

Qualche consiglio qui?

È stato utile?

Soluzione

Esiste un'opzione di compilazione per l'inserimento automatico di routine brevi. In Opzioni progetto, sotto Delphi Compiler - > Compilazione - > Generazione del codice, giro "Controllo controllo del codice" su Auto. Tenere presente, tuttavia, che questo dovrebbe essere solo su una build di rilascio, poiché il codice incorporato è difficile da eseguire il debug.

Inoltre, hai detto che non ti dispiace allargare il programma finché diventa più veloce, ma che spesso l'allineamento lo rende più lento. Dovresti essere consapevole che ciò potrebbe essere correlato. Maggiore è il codice compilato, maggiore sarà il numero di errori nella cache delle istruzioni, che rallenterà l'esecuzione.

Se vuoi davvero velocizzare il tuo programma, eseguilo attraverso un profiler. Consiglio a Sampling Profiler , che è gratuito, di funzionare con il codice Delphi (incluso il 2010) e non funziona rallenta la tua esecuzione. Ti mostrerà un rapporto dettagliato su quale codice stai impiegando più tempo a eseguire. Una volta che lo hai trovato, puoi concentrarti sui colli di bottiglia e provare a ottimizzarli.

Altri suggerimenti

L'allineamento può rallentare le cose in alcuni casi. La funzione integrata può aumentare il numero di registri della CPU richiesti per le variabili locali. Se non ci sono abbastanza registri, le variabili disponibili si troveranno invece nella memoria, il che rende più lento.

Se la funzione non è integrata, avrà (quasi) tutti i registri della CPU disponibili.

Ho scoperto che in genere non è una buona idea incorporare funzioni contenenti loop. Useranno un paio di variabili che probabilmente finiranno in memoria, rendendo più lento il codice incorporato.

Se si desidera forzare l'allineamento , utilizzare i file di inclusione. Devi assicurarti di dichiarare le variabili corrette, quindi utilizzare {$ I nomefile.inc }. Ciò inietterà sempre quel codice specifico nel punto desiderato e faciliterà la manutenzione se è necessario modificarlo.

Tieni presente che il compilatore è scritto da persone molto più intelligenti della maggior parte dei semplici mortali (incluso me stesso) e ha accesso a più informazioni quando decide di inline oppure no, quindi quando non lo fa probabilmente ha una buona ragione.

Se ho capito correttamente uno degli sviluppi del compilatore FPC (che ha lo stesso problema), l'inline può avvenire solo quando la routine da incorporare era già stata compilata.

IOW se si rende l'unità con le future funzioni inline una "foglia" unità, e inseriscilo come primo nella clausola usi del tuo progetto (.dpr), dovrebbe essere ok. Tieni presente che con " leaf " unità, intendo un'unità che non ha dipendenza dalle altre unità del progetto, ma solo dalle unità già compilate.

Non sarei sorpreso che fosse lo stesso in Delphi, dal momento che condivide un sistema di unità basato sugli stessi principi.

È anche abbastanza non risolvibile senza violare i principi di compilazione separati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top