2012-09-20 10 views
9

Powiel możliwe:
Why are interface method invocations slower than concrete invocations?Który z nich jest szybki, Klasa abstrakcyjna lub interfejs?

Niedawno miałem szansę zaistnieć w wywiadzie, w którym wywiad zapytał, który z nich jest szybsza wśród abstrakcyjna klasa i Interfejs. Chociaż nie rozumiem tego pytania, ale odpowiedziałem: Interfejs przede wszystkim dlatego, że myślałem, że późna koncepcja wiążąca może spowodować opóźnienie w wydajności w klasie abstrakcji. Po zbadaniu tego samego pytania w sieci, dowiedziałem się, że metody abstrakcyjne są szybsze, chociaż według niektórych blogów metody interfejsu są szybsze. Byłem trochę zdezorientowany, więc pomyślałem, aby zadać to pytanie, aby mieć prawidłowe zrozumienie tego, który z nich jest szybszy i dlaczego z silnym powodem.

Zgodnie z poniższą lekcją Klasa abstrakcyjna jest szybka, ale nie ma ku temu uzasadnionego powodu. http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

Odpowiedz

9

Odpowiedź zależy od języka programowania i ewentualnie używanego kompilatora. W środowiskach takich jak Java VM, w których wykorzystywane są optymalizacje w czasie działania, prawdopodobnie nie można w ogóle odpowiedzieć na te pytania. Szczerze mówiąc, w typowym projekcie Java nikt nie dba o to, nawet gdyby istniała jakakolwiek różnica, byłaby tak mała, że ​​nie spowolniłaby zauważalnie twojego oprogramowania. Jeśli nie masz ścisłych ograniczeń w czasie rzeczywistym, w takim przypadku nie używałbyś Javy (i prawdopodobnie nie byłby w ogóle polimorfizm).

Zasadniczo zarówno metody interfejsu, jak i metody abstrakcyjne wykorzystują dynamiczne wysyłanie, więc różnica jest minimalna, jeśli w ogóle istnieje. Bez dużej wiedzy o szczegółach zakładałbym, że teoretycznie, abstrakcyjne metody są wysyłane szybciej, o ile język nie implementuje dziedziczenia wielokrotnego dla klas. Pozycja wskaźnika metody w wektorze wysyłki byłaby statyczna, podczas gdy nie jest przeznaczona dla metod interfejsu (klasa może zazwyczaj implementować wiele interfejsów).

Ale jak powiedziałem, nie znam szczegółów na temat tego, co dzieje się w kompilatorze. Mogą być inne czynniki, o których nie myślałem. Gdybym musiał odpowiedzieć na to pytanie w wywiadzie, zacytowałbym don Knuth "przedwczesna optymalizacja jest źródłem wszelkiego zła".

0

Najlepsza odpowiedź na to pytanie to "Chciałbym napisać mały test, aby dowiedzieć się, jeśli naprawdę, naprawdę potrzebowałem do". Zdobądź prawdziwy przykład i uruchom go, w kontrolowanych warunkach, za pomocą dwóch implementacji, które różnią się tylko interfejsem od klasy abstrakcyjnej. Bez konkretnej implementacji pytania "co jest szybsze" nie mają większego sensu. Albo osoba przeprowadzająca wywiad próbowała się pochwalić (i prawdopodobnie nie znała faktycznej odpowiedzi), próbując sprawdzić swoje umiejętności krytycznego myślenia (czy to pytanie ma sens?), Czy też skrajnie nędzny.

Pierwsza zasada optymalizacji to nie optymalizuj ... jeszcze. Druga zasada to profilowanie twojego programu w celu znalezienia wąskich gardeł przed jakimkolwiek refaktoryzacją: zmiana algorytmu lub struktury danych właściwe miejsce jest często jedyną potrzebną; i jestem skłonny założyć się, że w, powiedzmy, Java, kompilator hotspot zrobi jakąkolwiek różnicę między abstrakcją a interfejsem, jeśli w ogóle, naprawdę trudno go znaleźć.

+0

surowo kusi, by powtórzyć pierwszą zasadę dwa razy, tak jak we wszystkich tych "pierwszej zasadzie w Fight Club" cytuje ... – tucuxi

+1

Problem z tą filozofią polega na tym, że nie ujawni ona, czy rzeczywiste czynniki mogą generalnie lepsze podejście do wykonywania czasami może być gorsze niż ogólnie gorsze.Na przykład, biorąc pod uwagę wybór między dwoma fragmentami kodu, z których jeden wymaga kilku dostępów vtable, a jeden z nich wymaga przydzielenia dodatkowych 32 bajtów śmieci, możliwe, że ten, który generuje więcej śmieci, byłby zwykle szybszy, ale mógłby w końcu jest znacznie wolniej, jeśli jest dużo śmieci gen2, które są dotykane pomiędzy cyklami zbierania gen0. – supercat

+0

Chodzi mi o to, że optymalizacja ręczna wszędzie jest o wiele gorsza w użyciu, niż optymalizacja * tylko tam, gdzie naprawdę się liczy *. Najpierw profil, znajdź, co jest na topie, i zoptymalizuj * to *. W przeciwnym razie marnujesz czas i wysiłek. – tucuxi

Powiązane problemy