Jeśli zamienić wszystkie odwołania do obiektów w moim programie Delphi za pomocą odniesień do interfejsu i użyć obiektów dziedziczonych z TInterfacedObject, czy powstała aplikacja będzie działać z tą samą szybkością, jak poprzednio? A może liczenie odwołań zwiększa obciążenie w czasie wykonywania?Jaki wpływ mają interfejsy na szybkość wykonywania w Delphi?
Odpowiedz
Liczenie odwołań może mieć wpływ, jeśli wykonujesz wiele przypisań tych interfejsów (lub przekazujesz je jako niestanowiące stałych, parametry inne niż var w wywołaniach funkcji).
Jednak prawdziwym problemem często nie jest samo liczenie odwołań, ale niejawna próba w końcu buduje kompilator, aby chronić licznik odwołań, który będzie sumował się z wezwaniami i może być najbardziej bolesny, jeśli wiele prostych metod (w porównaniu z pojedynczą dużą procedurą z całym twoim kodem, którego tak naprawdę nie chcesz).
Aby złagodzić ten aspekt, zawsze przekazywać interfejsy jako parametry const lub var, unikać zwracania interfejsów jako wyniku wywołania funkcji i minimalizować użycie lokalnych zmiennych typu interfejsu, preferować parametry const i bezpośrednie użycie pól obiektu.
Klasy z interfejsem niesie ze sobą narzut zwiększania i zwalniania liczby odwołań do każdej instancji tworzonej, przekazywanej i niszczącej, ale dopóki nie tworzysz, nie niszczysz i nie przekazujesz referencji w ciasnych pętlach, nie powinieneś odczuwać znacznego spowolnienia .
Można oczywiście wyłączyć liczenia odniesienia jako takie przez powrocie -1 w _AddRef i _Release przesłania, ale to nie przeszkadza kompilator od generowania te rozmowy ...
nie tylko liczenie odniesienia - po prostu dzwoniąc metody obiektu poprzez odniesienie do interfejsu zawsze implikuje narzut. Here można przeczytać, w jaki sposób metody obiektu są wywoływane przez odniesienie do interfejsu w Delphi.
- 1. Jaki wpływ mają różne metody Save 4ptions EF4 na ObjectContext?
- 2. Szybkość wykonywania zabawek Swift
- 3. Dlaczego nawiasy mają wpływ na skróty?
- 4. Jaki wpływ ma importowanie tylko niektóre funkcje modułu mają
- 5. Czy publiczne i prywatne mają wpływ na układ pamięci obiektu?
- 6. Obiekty Delphi, obiekty NIL i interfejsy
- 7. Dlaczego wartości większe od równych mają wpływ na WYBÓR MySQL?
- 8. Jaki jest wpływ selektora uniwersalnego na wydajność?
- 9. Jaki jest wpływ właściwości fillMode na kCAFillModeBackwards?
- 10. Czy szybkość kodowania została poprawiona w Delphi 2010?
- 11. Czy szybkość PostgreSQL SELECT ma niekorzystny wpływ na zbyt wiele indeksów w tabeli?
- 12. W jaki sposób weryfikujesz interfejsy oparte na kaczkach w pythonie?
- 13. Jaki jest wpływ ITIL lub CMMI na rozwój?
- 14. Jaki wpływ ma stosowanie wszystkich tych cech Scala w czasie wykonywania?
- 15. Jaki jest wpływ nie unikatowych indeksów na wydajność w pandach?
- 16. Jaki jest wpływ na @NonCPS w skrypcie potoku Jenkinsa
- 17. Z ProGuard, jaki jest wpływ na strategię testowania?
- 18. Tworzenie komponentów w czasie wykonywania - Delphi
- 19. Wpływ Console.Writeline na wydajność
- 20. Systemtap wpływ na wydajność
- 21. Jaki jest wpływ CONVERT() na INDEX podczas wyszukiwania?
- 22. Jaki jest wpływ leniwy = "false" na element klasy mapowania NHibernate?
- 23. Jaki wpływ ma liczba końcowa na treść skryptu awk?
- 24. Jaki jest wpływ nadchodzący z symbolu wieloznacznego%
- 25. Kod przykładowy prosty egzekwowanie wykonywania danych Delphi
- 26. Jaki jest wpływ zmiany ustawienia "Dynamiczne RTL" dla biblioteki statycznej?
- 27. W jaki sposób interfejsy Java są implementowane wewnętrznie? (vtables?)
- 28. Jaki jest wpływ wydajności wyłączania eager_load w production.rb?
- 29. Wpływ IsBackground na wątki .Net?
- 30. Log.d i wpływ na wydajność
Zatem (poza używaniem w interfejsach) blok 'try finally' miałby również znaczący wpływ na szybkość, nawet jeśli nie występują wyjątki? – mjn
Tak, może, zwłaszcza w prostych procedurach, ponieważ próba-w końcu reprezentuje całkiem sporo kodu (na poziomie ASM), a także zapobiega kompilatorowi generującemu najbardziej wydajny kod wejściowy i wyjściowy. Na przykład sprawdź to, jest to przypadek niejawnego kodu bezpieczeństwa try-finally, który nie jest nawet wykonywany, ponieważ niejawne try-finally są dołączone do kompilatora do procedury, w której się znajdują, a nie do kodu, który może się nie powieść . Więc płacisz za to w wywołaniach procedur, nawet jeśli nie wykonasz kodu, który może zawieść. http://delphitools.info/2009/05/06/code-optimization-go-for-the-jugular/ –
Po prostu przeczytałem twoją odpowiedź jeszcze raz - jedno pytanie dotyczące "unikania powracających interfejsów jako wyniku wywołania funkcji", robi to oznacza, że na przykład funkcja Factory nie powinna zwracać obiektów przez odwołania do interfejsów, ale instancje klasy? Więc 'TSomeFactory.CreateX' powinien mieć' TMyImplementationOfX' a nie interfejs 'IX' jako typ zwracany? – mjn