Låt mig chansa på en sak. Du testar på en device som inte har jitkompilering påslaget (iom att det fortfarande är avstängt by default). Om det är fallet så visar inte testet något om vilken prestanda man har i Java, utan mer om att Dalvik VM fortfarande inte kommit så långt som övriga VMs (tills Jit blir påslaget)
Även om ditt testfall hade körts på en VM med jitkompilering påslaget så hade jag förväntat mig skillnader. Att göra ett test och mäta prestanda på en enskild beräkning säger inte så mycket om hur hela applikationer går.
Var t.ex i höstas på JAOO och lyssnade på ett föredrag som en snubbe från Oracle höll (detta var innan Oracle köpte Sun). Han sade att deras C/C++ kod spöade Java när man skrev saker som skulle vara enkeltrådade, men så fort de skrev saker som var gjorda för multitrådning så blev det slagna av Java. Detta pga att trådsäkerhet/multitrådning inte är något som C/C++ är gjort för, och därför tas lås över större områden.
Java är också bättre på t.ex minneshantering (allokering av objekt i Java är snabbare än i C++):
Java theory and practice: Urban performance legends, revisited
"You don't have to search through too many blogs or Slashdot postings to find confidently worded statements like "Garbage collection will never be as efficient as direct memory management." And, in a way, those statements are right -- dynamic memory management is not as fast -- it's often considerably faster. The malloc/free approach deals with blocks of memory one at a time, whereas the garbage collection approach tends to deal with memory management in large batches, yielding more opportunities for optimization (at the cost of some loss in predictability)."
Det roliga med en bra JIT är dessutom att den optimerar kod dynamiskt i runtime medans en C/C++ kompilator endast kan optimera kod statiskt vid kompilering (statiskt kompilering är något som passar väldigt bra för ditt testprogram iom att det är litet och mycket kan hanteras i register)
Kort och gott: Man bör inte jämföra exekveringen av en liten metod och sedan dra slutsatser om hur stor skillnaden är mellan applikationer skriva i X och Y.
Kaj
Ps. Jag säger inte att Java är snabbare, eller nära C/C++ i hastighet. Säger bara att testet inte visar så mycket, och när du skriver en hel applikation så är det oftast valet av tekniker, algorithmer och hur bra programmerare du har som avgör prestandan.
Click to expand...