No to ciekawe, bo np w przypadku http://shootout.alioth.debian.org/u64q/benchmark.php?test=fasta&lang=all język C++ na pewno na natywny nie wygląda.
Są jeszcze inne ciekawe przypadki.
http://shootout.alioth.debian.org/u64q/benchmark.php?test=threadring&lang=all
Najszybsze implementacje omijają chyba w całości wbudowane w system mechanizmy.
http://shootout.alioth.debian.org/u64q/benchmark.php?test=binarytrees&lang=all
Tutaj w sumie też - jedyne rozwiązania C/ C++, które są szybsze od Javowych korzystają z pul obiektów (Javowa wersja nie korzysta z pul). Te które korzystają są sporo (2x - 3x) wolniejsze od rozwiązania Javowego.
Haskell produkuje kod natywny (GHC), a jest wolniejszy od Javy.
VMki mają więc nawet potencjał na produkowanie kodu szybszego niż natywny dzięki temu, że mogą omijać prawie w całości wolne mechanizmy wbudowane w system. Ponadto widzę jeszcze więcej możliwości:
- dynamiczna dewirtualizacja/ deoptymalizacja/ itp - jeśli funkcja przyjmuje powiedzmy parametr typu List, to czasem może to być ArrayList a czasem LinkedList. Załóżmy, że przez 5 min jest to ArrayList, a przez następne 5 min jest to LinkedList. VMka ma możliwość przekompilowania kodu po 5 min i zoptymalizowania go dla LinkedList zamiast dla ArrayList. Kompilacja statyczna tego nie umożliwia,
- switche i tym podobne: załóżmy że mamy switcha na 10 możliwości i przez pierwsze 5 min najczęstsza jest pozycja 3. a przez następne 5 min najczęstsza jest pozycja 7. Sytuacja jest analogiczna jak powyżej.
- fragmentacja pamięci - standardowo w x86 tłumaczeniem adresów logicznych i fizycznych zajmuje się sam procesor i to przy wykonywaniu każdej instrukcji ładowania/ zapisywania pamięci. Można wyrzucić ten mechanizm z CPU, zamieniając go na np kolejne jednostki obliczeniowe, a sam mechanizm zaimplementować programowo. VMka mogłaby dynamicznie optymalizować kod dla pofragmentowanej pamięci jak i dla niepofragmentowanej, ponadto odśmiecacz generalnie defragmentuje pamięć, mógłby ją też w odpowiedniej kolejności układać, tak aby można było zoptymalizować odwołania do pamięci,
- i tak dalej, moim zdaniem dzisiejsze VMki typu JVM mają jeszcze długą drogę przed sobą jeśli chodzi o dynamiczne optymalizacje,
Ogólnie rzecz biorąc: kryterium szybkości wykonywania kodu jest kiepskim kryterium dla określenia poziomu natywności kodu.
Natywność można by w sumie zmierzyć ilością warstw abstrakcji nad sprzętem/ systemem - im mniej warstw tym bardziej natywny kod.