W praktyce cały czas nie jest 20% a 2x-3x i to jak się jest bardzo ostrożnym. Jak się nie uważa, i pisze w stylu OOP albo FP a nie data-oriented, to spokojnie można stracić 90% wydajności i nawet trudno zauważyć kiedy i gdzie zniknęło.
Ale o czym mówimy? Liczby bez kontekstu nic nie znaczą, można sobie podać zupełnie dowolne dane i dowolnie je zinterpretować pod dowolną tezę - nikt nie sprawdzi. Można napisać program w Pythonie, który będzie nieskończenie szybszy niż program C, choć będą robić dokładnie to samo. Więc te dane, bez kodu i usecase są nic nie warte - możemy dyskutować jak filozofowie.
Dlaczego o tym wspominam: bo też śledze temat wydajności, i jeszcze nie trafiło mi się, żeby ktoś nie zareagował na "ostateczny" przykład wydajności w jakimkolwiek języku - zawsze znajdzie się maher co "zejdzie" kolejne kilka procent, jakimś abstrakcyjnym kodem, choć "reszta" maherów już myślała, że nie da się (dotyczy w zasadzie każdego języka).
Dobry przykład: stockfish (silnik szachowy, bardzo mocno cpu-bound), napisany w C++, gdzie nieraz PRy ciągną 20 plików masakrycznych zmian, bo ktoś "wynalazł" wzrost wydajności o 2% stosując jakieś supertricki bitowe i przesunięcia na rejestrach, ledwie udokumentowane w najnowszych CPU, które zna marny procent inżynierów. Tylko co z tego, jak np. inny silnik (LC0) jest z ~3000x wolniejszy w analizie pozycji, a gra lepiej, bo bazuje na zupełnie innym algorytmie - równie dobrze mogliby go w Pythonie napisać, bo to algorytm decyduje o tym co w tym najważniejsze: o sile gry. I podejrzewam, że podobnie jest w przypadkach optymalizacji w innych dziedzinach. Więc nie rozpędzałbym się z tą wydajnością za wczasu.
Druga sprawa to przewidywalność wydajności - w aplikacjach desktopowych ważne jest szybkie działanie od początku, a nie stopniowe rozpędzanie się.
Moim zdaniem, znowu zbyt szeroko powiedziane - jest pełno aplikacji w pythonie (to chyba nie jest przedstawiciel "szybkich" języków?) na linuksach, które mają przyzwoitą wydajność, nawet nie idzie w ogóle dociec, że one są w Pythonie (patrz: terminator, kupfer - te które ja znam). Nie robią cudów na procesorze, wystarczy, że robią co powinny i nie zauważam, by wydajnościowo odbiegały od natywnych. Jest wręcz odwrotnie, choć to wrażenie czysto subiektywne nic nie mające wspólnego z porządnymi pomiarami (krunner vs kupfer, krunner w C++, jakkolwiek go nie skonfiguruję, to zawsze jest wolniejszy niż kupfer w pythonie, więc nie wiem co on tam robi "jeszcze")
Ba! To jest ważne również w aplikacjach serwerowych. Jak klient ma zrestartować klaster ze 100 serwerów i każdy startuje 30-50 sekund, ale rozpędza się
kolejne kilka minut, to trudno się dziwić, że taki klient będzie się przed tym bronić jak tylko może.
Dziś są takie wynalazki jak canary deployment i nikt nie będzie wstrzymywał oddechu, bo jakiś restart się dzieje. Nie te czasy. Teraz część infrastruktury może się cały dzień restartować i nikt tego nie zauważy zwyczajnie (jeśli jest to zrobione dobrze)
moja aplikacja jest w całości napisana w C#, choć wykorzystuje bindingi do Qt, OpenCV i Tensorflow
:-P