Gdzie mieści się Cel C w kontinuum wydajności językowej?

20

Wydaje się, że jest wiele dyskusji na temat różnych zalet szybkości dla C lub C ++ w porównaniu do powiedzenia Java lub Python, ale rzadko widzę wspomniany Cel C. Z grubsza, gdzie leży to pod względem wydajności językowej?

Fomite
źródło
23
1986 - Brad Cox i Tom Love tworzą Objective-C, ogłaszając, że „ten język ma całe bezpieczeństwo pamięci C w połączeniu z całą niesamowitą szybkością Smalltalk”. Współcześni historycy podejrzewają, że obaj byli dysleksyjni. ( źródło )
Mason Wheeler
4
Należy do zakresu, w którym wydajność nie ma większego znaczenia. Jest to jedyny obsługiwany język interfejsu do Cocoa, więc jeśli chcesz to zrobić, nic innego nie działa. W każdym innym przypadku uważam to za okropny wybór, niezależnie od wydajności.
Jerry Coffin
1
„wydajność” nie jest cechą charakterystyczną języka, ale implementacją języka i, co ważniejsze, programów napisanych w tym języku. Możesz pisać bardzo szybkie programy w Objective-C lub możesz pisać bardzo wolno.
Caleb
Nie ma obrzydliwej składni, ale nie jest źle działającym językiem opartym na jego obecnych kompilatorach, ponieważ wydajność jest bardziej oparta na kompilatorze / vm niż na rzeczywistym języku.
Platforma

Odpowiedzi:

28

W przeciwieństwie do C ++, Objective-C został zaprojektowany jako czysty nadzbiór C. Niewiele kompilatorów Objective-C, których używałem, są lepiej znane jako kompilatory C, ale także obsługują Objective-C.

Można więc bezpiecznie założyć, że na poziomie generowania kodu C i Object-C są równoważne.

Pierwsza różnica pojawia się w OOP ABI, zwanym także „późnym wiązaniem metody”. Podobnie jak w C ++, Objective-C opiera się na tabelach wskaźników funkcji generowanych przez kompilator, które przechodzą w czasie wykonywania.

Jednak w przeciwieństwie do C ++ metoda wiązania jest bardziej „dynamiczna” i promuje stosowanie idnadklasy wszędzie, co czyni ją nieco wolniejszą niż C ++ w teorii. W praktyce różnica ta jest znacznie mniejsza niż mierzalna.

Wreszcie najważniejszym problemem związanym z wydajnością jest jakość używanych bibliotek. Ponieważ Objective-C jest naprawdę popularny tylko w systemach Apple, można założyć, że używasz go z kakao; który jest dobrym zestawem bibliotek wysokiego poziomu. W większości przypadków możesz zostawić im ciężkie podnoszenie, więc twój kod albo nie musi być tak szybki, albo jeśli wykonujesz ciężkie crunch, prawdopodobnie będzie to w większości statyczna baza kodu, mniej więcej podobna do zwykłego C .

TL; DR: jest tam właśnie w językach C i C ++, gdzie ma to największe znaczenie. Jeśli nie osiągasz dobrej wydajności, sprawdź swoje algorytmy; tak jak w każdym poważnym języku.

Javier
źródło
4
W rzeczywistości nowoczesny cel-c jest mniej więcej tak samo nowoczesny jak C ++. W C możesz wykonywać arytmetykę na dowolnych wskaźnikach, nie możesz w ObjC. Mierzona jest także różnica wydajności wynikająca z wyszukiwania metod: szybka ścieżka objc_msgSend jest około cztery razy cięższa niż wywołanie funkcji składowej (a wolne ścieżki nie są tak szybkie jak szybka ścieżka).
11

Cel C jest wolniejszy niż C / C ++. Powodem jest środowisko wykonawcze Objective-C, które dynamicznie wywołuje wyszukiwanie metod w środowisku wykonawczym w taki sam sposób, jak Smalltalk, z którego przejęło ten model wykonania. Wysyłanie wszystkich metod w czasie wykonywania jest nazywane „wysłaniem prawdziwej wiadomości”, w przeciwieństwie do wywołania funkcji w C / C ++, gdzie adres funkcji jest określany w czasie kompilacji (z wyjątkiem metod wirtualnych C ++). Ale nie mogę powiedzieć, o ile wolniejszy jest Cel C. ASAIK służy wyłącznie do tworzenia aplikacji ze względu na obniżenie wydajności.

OlliP
źródło
1
Znalazłem to porównanie wydajności z C: rmarcus.info/?p=488 Wygląda na to, że Objective-C jest jednak dość zbliżony do C.
OlliP
Byłoby miło, aby porównać Objective C z resztą paczki w grze benchmarków
Deer Hunter
Myślę, że porównanie wydajności musi być przeprowadzone z odrobiną soli, ponieważ kod celu C ma w pewnym stopniu rozszerzyć kod C, a nie wysyła komunikat Objecttive-C. Nie wiem do czego służy obniżka. Tworzyłem program Smalltalk od ponad dekady, a Objective-C jest oparty na Smalltalk na wiele sposobów. Chyba wiem o czym mówiłem.
OlliP
Nie zstępujący; interesują mnie przede wszystkim algorytmy numeryczne, dynamiczne wysyłanie nie ma w nich większego znaczenia .
Deer Hunter,
8

Krótka odpowiedź: jest skompilowany do podobnego formatu jak C / C ++ / D / Go / Rust. Nie korzysta ze środowiska wirtualnego, takiego jak Java / .Net. I nie jest interpretowane jak Python / Ruby / Lua / JavaScript. Tak jest na szybszym końcu spektrum.

Jacks_Gulch
źródło
7

Podstawowe różnice prędkości między Obj-C i C / C ++, jak mówi poniżej Oliver, wynikają z dynamicznej wysyłki metod.

Ten artykuł profiluje ten narzut w Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946

Zapewnia również bardzo dobrą sztuczkę optymalizacji kodu Obj-C, gdy określasz, że metoda wysyłania metod (tj. Objc_msgSend) jest czynnikiem ograniczającym - uzyskaj wskaźnik do funkcji jeden raz i użyj go, aby wywołać funkcję wiele razy. Nie powinno to zbytnio pomóc, ponieważ środowiska wykonawcze Obj-C przeprowadzają tę optymalizację automatycznie .

Należy pamiętać, że prawdziwy koszt dynamicznej wysyłki metody wynika z braków pamięci podręcznej, ponieważ przerywa przewidywanie gałęzi procesora. Są trudne do profilowania i być może kod cytowany powyżej nie mierzy rzeczywistego kosztu braku pamięci podręcznej.

Bardziej użyteczna dyskusja znajduje się tutaj: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605

Podsumowując: największe różnice między językami to twoje algorytmy. Poza tym istnieje zasadnicza różnica prędkości między Obj-C, C i C ++, ze względu na dynamiczne lub wirtualne wysyłanie metod. Ten drugi punkt nie wydaje się być duży. A powyższy artykuł zawiera sposób na zoptymalizowanie go, jeśli można znaleźć punkty aktywne za pomocą profilowania, co może być trudne z powodu braków pamięci podręcznej procesora.

MHH
źródło