Istnieją dwa podstawowe powody, dla których Java jest szybsza niż Go i C ++ oraz może być szybsza niż C w wielu przypadkach:
1) Kompilator JIT. Może wbudowywać wywołania funkcji wirtualnych na wielu poziomach, nawet z klasami obiektowymi, w oparciu o profil środowiska wykonawczego. Nie jest to możliwe w języku kompilowanym statycznie (chociaż może pomóc nowsza ponowna kompilacja oparta na zarejestrowanym profilu). Jest to bardzo ważne w przypadku większości testów porównawczych, które obejmują powtarzalne algorytmy.
2) GC. Alokacja pamięci oparta na GC jest prawie bezpłatna w porównaniu do malloc. A „bezpłatna” kara może być amortyzowana przez cały czas działania - często jest pomijana, ponieważ program kończy działanie, zanim wszystkie śmieci będą musiały zostać zebrane.
Istnieją setki (tysiące?) Niezwykle utalentowanych programistów, dzięki którym GC / JVM jest wydajne. Myślenie, że potrafisz „kodować lepiej niż oni wszyscy”, jest głupotą. U podstaw leży problem ludzkiego ego - ludziom trudno jest zaakceptować, że przy odpowiednim przeszkoleniu przez utalentowanych ludzi komputer będzie działał lepiej niż ludzie, którzy go zaprogramowali.
Przy okazji, C ++ może być tak samo szybki jak C, jeśli nie używasz i nie korzystasz z funkcji OO, ale na początku jesteś prawie blisko programowania w C.
Co najważniejsze, „różnice prędkości” w tych testach są zwykle bez znaczenia. Koszty we / wy są o rzędy wielkości większe niż różnice w wydajności, a zatem właściwe projekty, które minimalizują koszty we / wy, zawsze wygrywają - nawet w języku interpretowanym. Bardzo niewiele systemów jest związanych z procesorem.
Na koniec, ludzie nazywają „komputerową grę porównawczą” jako „miernik naukowy”. Testy są całkowicie błędne, na przykład, jeśli przeglądasz testy Java dla nbody. Kiedy uruchamiam testy na tym samym systemie operacyjnym / sprzęcie, otrzymuję około 7,6 sekundy dla Javy i 4,7 sekundy dla C - co jest rozsądne - a nie czterokrotne spowolnienie, które zgłaszają testy. To przynęta na kliknięcia, fałszywe wiadomości, mające na celu generowanie ruchu w witrynie.
Na koniec, ostatnia uwaga ... Przeprowadziłem testy używając Go i trwało to 7,9 sekundy. Fakt, że po kliknięciu Go, porównuje ją z Javą, a po kliknięciu Java porównuje ją z C, powinien być czerwoną flagą dla każdego poważnego inżyniera.
Aby zobaczyć rzeczywiste porównanie Java, Go i C ++, zobacz https://www.biorxiv.org/content/10.1101/558056v1 alert spoilera, Java jest najlepsza pod względem surowej wydajności, a Go wychodzi na szczyt dzięki połączonemu użyciu pamięci i czas ściany.