2010-08-16 13 views
9

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

8

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.

+0

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

+3

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/ –

+1

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

6

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 ...

2

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.

Powiązane problemy