Napsal jsem jednoduchy lowlevel test. Interface s metodami void add(), void add(int), 2 implementace, kazda do member promenne pricita nejake konstantni cislo, funkce
void count(Iface * p) { for (int i = 0; i < 1000000000; i++) p->add(); }
Zalozil jsem instance a,b tech trid a dostal jsem tyto vysledky:
nahodne vybrani a nebo b a 3× volani count s add()
JIT 0.5s
c++ 10s
to same s addX(nahodna konstanta)
JIT 0.56s
c++ 13s
to same s addX(i)
JIT 2.2s
c++ 13s
jednou count s add()
java bez JIT 14s
Zaver – JIT dokaze za behu inlinovat virtualni metody, kdyz je vnitrek cyklu konstantni, tak ho dokaze i „rozbalit“. Jakykoli prekladac do nativu nema sanci, pokud si to nemuze vyhodnotit behem prekladu.
Samozrejme je to extremni pripad, ale jako reakce na „JIT nemuze…“ to myslim staci.
Pro me to znamena, ze se muzu klidne zabyvat navrhem a OOP v jave a nemusim delat nejake kompromisy v c++ aby to nebylo pomale. Kdyz navic vezmu v uvahu GC, ktery mi usetri dalsi praci a ve slozitejsich aplikacich je rychlejsi nez new/delete, tak je volba jasna :-)