Se sostituisco tutti i riferimenti agli oggetti nel mio programma Delphi con i riferimenti all'interfaccia e utilizzo gli oggetti ereditati da TInterfacedObject, l'applicazione risultante verrà eseguita con la stessa velocità di prima? O il conteggio dei riferimenti aggiunge un sovraccarico di esecuzione significativo in fase di esecuzione?Quale effetto hanno le interfacce sulla velocità di esecuzione in Delphi?
risposta
Il conteggio dei riferimenti può influire su di voi se si eseguono molte assegnazioni di tali interfacce (o le si passano come parametri non const, non var in chiamate di funzione).
Tuttavia il vero problema spesso non è il riferimento che conta in sé, ma il try-finally implicita costruisce il compilatore aggiunge per proteggere il conteggio di riferimento, che si sommano alle chiamate in testa, e può essere più dolorosa se si dispone di molti semplici metodi (rispetto a un'unica grande procedura con tutto il codice all'interno, che non si vuole veramente).
Per attenuare questo aspetto, passare sempre le interfacce come parametri const o var, evitare di restituire interfacce come risultato di chiamata di funzione e ridurre l'utilizzo di variabili locali del tipo di interfaccia, preferire parametri const e usi campo diretto dell'oggetto.
classi interfacciato siano portatori di un overhead di incrementare e rilasciando il conteggio di riferimento di ogni istanza che si crea, passano e distruggono, ma a meno che non si sta creando, distruggendo e passando i riferimenti a cicli stretti, non si dovrebbero verificare alcun significativo rallentamento .
Ovviamente si può disabilitare il conteggio dei riferimenti in quanto tale restituendo -1 nel _AddRef e _Release prevale, ma ciò non impedisce al compilatore di generare quelle chiamate ...
Non solo il conteggio dei riferimenti - basta chiamare i metodi dell'oggetto tramite riferimento all'interfaccia implica sempre un sovraccarico. Here è possibile leggere come vengono chiamati i metodi dell'oggetto tramite il riferimento all'interfaccia in Delphi.
- 1. Le interfacce PHP hanno proprietà?
- 2. Delphi Rtti: esplora le proprietà delle interfacce?
- 3. Prova a comprendere le interfacce Delphi
- 4. Gli oggetti modello hanno interfacce?
- 5. Che effetto hanno le diverse SaveOptions EF 4 sull'ObjectContext?
- 6. le modifiche css non hanno effetto nello studio di visualizzazione
- 7. Perché hanno deciso di rendere le interfacce "Operazioni opzionali"
- 8. Interfacce libreria virtuale per Delphi/Win32?
- 9. Le query multimediali non hanno effetto sul ridimensionamento del browser
- 10. Oggetti Delphi, oggetti NIL e interfacce
- 11. In che modo startMonitoringSignificantLocationChanges e startUpdatingLocation hanno effetto l'un l'altro?
- 12. Quale hardware limita la velocità di tracciamento in R?
- 13. Errore: "Le chiamate a mailbox_fql hanno superato la velocità di 300 chiamate per 600 secondi"
- 14. TcpListener: come ascoltare sulla porta specifica su tutte le interfacce?
- 15. Confronto tra stabilità, velocità e aiuto di Delphi 2010 in altre versioni di Delphi
- 16. Velocità di esecuzione del parco giochi Swift
- 17. Quali sono le differenze tra l'implementazione delle interfacce in Delphi e Lazarus (FPC)?
- 18. Come misurare la velocità di esecuzione di una funzione Arduino?
- 19. Come ottimizzare questa query in termini di velocità di esecuzione
- 20. Delphi Aggiunta di elementi alla velocità di ComboBox
- 21. Costo della query rispetto alla velocità di esecuzione + parallelismo
- 22. Informazioni sulla velocità della pagina Google - Autenticazione di base
- 23. fa C# hanno l'equivalente di modificatore di privati di Delphi
- 24. IIS 7.5. Impossibile disabilitare le regole di riscrittura degli URL (ho eliminato le regole ma hanno ancora effetto)
- 25. Le "porte" su docker-compose.yml hanno lo stesso effetto di EXPOSE su Dockerfile?
- 26. Dove posso trovare informazioni sulla struttura di Delphi VMT?
- 27. array_map sulla raccolta con interfacce array?
- 28. Come posso cercare una base di codice Java per le interfacce che hanno un singolo metodo?
- 29. Se le interfacce non hanno costruttori, la classe Object è una super classe di un'interfaccia?
- 30. Le opzioni di ottimizzazione g ++ hanno effetto sul valore della funzione sin
Quindi (oltre all'uso nelle interfacce) un blocco try finally' avrebbe anche un effetto significativo sulla velocità, anche se non si verificano eccezioni? – mjn
Sì, soprattutto nelle procedure semplici, perché un try-finally rappresenta un bel po 'di codice (a livello di ASM) e impedisce al compilatore di generare il codice di entrata e uscita più efficiente. Per esempio, verifica questo, è un caso di un codice di protezione implicita alla prova che non viene nemmeno eseguito, perché implicitamente try-finally sono collegati al compilatore alla procedura in cui si trovano e non al codice che può fallire . Quindi lo paghi nelle chiamate di procedura, anche se non esegui il codice che può fallire. http://delphitools.info/2009/05/06/code-optimization-go-for-the-jugular/ –
Ho appena letto di nuovo la tua risposta - una domanda su 'evitare di restituire interfacce come risultato di chiamata di funzione', fa questo significa che per esempio una funzione Factory non dovrebbe restituire oggetti tramite riferimenti all'interfaccia ma istanze di classe? Quindi 'TSomeFactory.CreateX' dovrebbe avere' TMyImplementationOfX' e non l'interfaccia 'IX' come tipo restituito? – mjn