O ile rozumiem, wszystkie języki skryptowe i podstawowe programy naukowe są zwykle napisane w C; powoduje to, że implementacja jest nieuporządkowana, ale w pewnym sensie bezpośrednio do celu.
Rozumiem, że ci ludzie chcieliby maksymalnie zwiększyć swoją wydajność, ale czy istnieje prawdziwa różnica między używaniem ciągów C i struktur C a używaniem klas C ++; Wydaje się, że C ++ działa w ten sam sposób, poza funkcjami wirtualnymi, przechowuje funkcję klasy raz, a każda instancja tej klasy wywołuje tę jedną funkcję.
Co sprawia, że C jest szybsze i czy jest to zauważalna różnica w projektach takich jak Python lub sqlite, które muszą być najszybsze?
c++
c
performance
Will03uk
źródło
źródło
Odpowiedzi:
C ++ jest często używany w programach naukowych. Popularność języka C może słabnąć w tej domenie. Fortran pozostaje popularny jako język „niskiego poziomu”.
W C ++ „płacisz tylko za to, czego używasz”. Nie ma więc nic, co spowalniałoby go wolniej niż C. W szczególności w przypadku programów naukowych szablony wyrażeń umożliwiają wykonanie pewnej niestandardowej optymalizacji przy użyciu silnika szablonów do przetwarzania semantyki programu.
Powodem, dla którego język C jest preferowany w projektach takich jak Python, jest to, że czytanie jest mniej zagmatwane, więc duża baza kodu będzie bardziej dostępna dla większej puli współpracowników.
SQLite wymaga małego rozmiaru kodu wykonywalnego, gdzie C ma niewielką przewagę. Rozsądne użycie C ++ nadal pozwala na użycie w aplikacjach wbudowanych, ale jest mniej popularne ze względu na obawy, że wkradną się niechciane funkcje językowe.
źródło
extern "C"
. Swig używa C jako lingua franca, ale możesz zaimplementować to opakowanie w podzbiorze C ++ zgodnym z C i nigdy nie wywoływać kompilatora C.Nie sądzę, aby powód był tak bardzo związany z wydajnością, jak z interoperacyjnością. Język C ++ jest bardziej złożony niż język C, ale z punktu widzenia wydajności nie powinno być zauważalnych różnic w obu przypadkach. Niektóre konstrukcje C ++ są szybsze niż ich odpowiedniki w C (
std::sort
są szybsze niżqsort
) i prawdopodobnie istnieją dobre przykłady odwrotnej sytuacji.EDYCJA: Po stronie interoperacyjności ...
Zasadniczo standard C ++ nie definiuje niektórych rzeczy, które mogą być potrzebne do łatwego współdziałania między plikami binarnymi utworzonymi za pomocą różnych kompilatorów / wersji. Najbardziej zauważalną kwestią byłaby konwencja nazewnictwa symboli w systemie binarnym. W języku C język definiuje pojedyncze mapowanie z każdego symbolu w kodzie na nazwę symbolu binarnego. Wywołana funkcja
my_function
utworzy symbol w wywołanym pliku binarnymmy_function
. Z drugiej strony, ze względu na cechy takie jak przeciążanie funkcji, nazwy funkcji C ++ muszą zostać zniekształcone(przetłumaczone na różne symbole funkcji w pliku binarnym, kodujące typy argumentów i typy zwracane), a standard nie definiuje, w jaki sposób odbywa się zniekształcanie. To z kolei oznacza, że ta sama funkcja w C ++ może być skompilowana do różnych symboli w zależności od kompilatora (chyba żeextern "C"
jest używana do wymuszenia współdziałania C dla tych funkcji w C ++).Pod koniec dnia interfejs między językiem skryptowym a rodzimym kodem i tak musiałby być interfejsem C, nawet jeśli szczegóły dotyczące jego wewnętrznej implementacji mogłyby być C / C ++ / jakimkolwiek innym językiem ojczystym.
(Celowo nie chcę wdawać się w płomienną wojnę o preferencje językowe, C ++ jest naprawdę potężny, ale jest też trochę przerażający, ponieważ jest znacznie bardziej złożonym językiem niż C, a niektóre rzeczy, które wyglądają na proste, mogą mieć wpływ na wydajność)
źródło
std::sort
jeden z takich przykładów:std::less
funktor używany domyślnie nie jest mniej wydajny niż równoważna funkcja w C, ale wszystkie znane mi kompilatory wbudują go (jako szablon jest dostępny do wstawiania) i usuwają wszystkie wywołania funkcji docompare
funktora.Jak Bjarne wspomniał w [D&E], efektywność jest jednym z głównych celów C ++. Więc C ++ jest wolniejszy tylko wtedy, gdy programista używa swoich "dodatkowych" funkcji, takich jak funkcje wirtualne, o których wspomniałeś, informacje rtt itp
Myślę więc, że jest to bardziej z powodów psychologicznych - używane jest C, ponieważ nie pozwala na "powolne" funkcje C ++.
źródło
Języki nie są z natury szybsze ani wolniejsze, interpretery i kompilatory mogą być mniej lub bardziej wydajne.
Poza tym języki wyższego poziomu zapewniają warstwy abstrakcji, które zwykle wiążą się z kosztami czasu wykonania. Jeśli ich nie używasz, kompilator może być wystarczająco sprytny, aby je usunąć, ale może to nie być możliwe, jeśli semantyka języka nie pozwala na to bezpiecznie ... A jeśli ich potrzebujesz, zaimplementuj je samodzielnie w przypadku języka niższego poziomu będzie prawdopodobnie wolniejsze niż używanie języka „wolnego”.
źródło
restrict
Przykład : słowo kluczowe w C lub luajit - to ostatnie nie wysadza z wody co drugi vm dla języków dynamicznych tylko dlatego, że Mike jest sprytnym facetem, ale także dlatego, że semantyka Lua jest dość przejrzysta (w porównaniu np. z JavaScriptem)