>Meglepődnél, milyen effektív a java C2 compilere.
Konkrét projekt tapasztalat alapján tudom, amit végigméregettem, hogy nem lehet natív C teljesítményt elérni az adatmodell miatt. Amúgy tényleg nagyon jó ahhoz képest, amit ki lehet hozni belőle, azt kihozza. Azt, hogy az adott gépre tud optimalizálni, azt elhiszem, de nem mértem ki.
>mint a sima ArrayList, ami ugye végső soron egy sima malloc() -ba pakolja az elemeket.
Csakhogy nem az elemeket pakolja egy tömbbe, hanem az elemekre mutató pointereket! Ez az ami nem mindegy. Egy plusz indirekciód mindenképpen van, csak annyi, hogy nem kettő. Talán most már vannak vagy lesznek tömör adatszerkezetek is, a legújabbakat nem követem 100%-ban.
>Ezen felül az igazán durva arcok olyat is tudnak, hogy GC-free kód
Én vagyok az egyik ilyen igazán durva arc :-). Végigcsináltam egy projeken, hogy a belső folyton ismételt loop GC free legyen. Egyrészt kicsit vérhugyozós volt, másrészt pedig pont elveszíted azt, amitől olyan egyszerű Java-ban programozni. Saját gyűjtemény replacementeket is csináltam, meg "stack"-szerű adatszerkezetet tömbben tárolva, meg objektum cache-t. Jó kis kalamajka azért, hogy ott legyél, mintha C-ben egy arena allocatort csináltál volna például, amit ismétlésenként újra lehet használni például.
>GC is tud "compression"-t, vagyis a fragmentált memória-területeket összefésüli időnként - ezt spec. még a malloc() se tudja
A töredezettség ellen ez jó, de az ellen nem véd, hogy a szemantikailag összetartozó dolgok nem lesznek egymás mellett.
>a különbség teljesítményben már korántsem olyan meghatározó/egetverő, mint 20 éve; konkréten 20-30% körül mozog.
Vagy igen vagy nem. Nekünk még 10%-ot tanítottak, azóta fejlődött a Java, és mégis nagyobb lett a különbség :-). Mert ez egy reálisabb becslés végre. De a konkrét feladaton múlik, hogy mennyi lesz az a 20-30%, és ha peched van lehet az akár 100% felett is. Például ha kimész a cache-ből, ami C-ben beleférne, vagy a random ugrálás patternt nem tudod elkerülni ott, ami C-ben lineáris olvasás és írás lenne...
Még egy olyan trükköt is implementáltam egyszer, hogy ami C-ben struktúrák tömbje lett volna, azt betettem egy nagy int tömbbe. És írtam hozzá public static accessorokat, ami index alapján kikeresi a nevesített mezőket. A statikusakat ugye a JIT be tudja inline-olni. Na, ezt az adatszerkezetet implementálni és használni is jó nagy szívás és a végén olyan tempóban fog hasítani, mint... mintha megírtuk volna C-ben simán struktúrák tömbjeként :-).