Salut,
Je trifouillais un peu sur du Scala récemment, et j'ai été surpris de la relative lenteur de la bête, malgré ce qu'on en dit. Du coup, j'ai voulu faire des tests, pas du tout significatifs, pour comparer ça à C++ et Java, et les résultats m'ont quelque peu... surpris, ne serait-ce qu'entre C++ et Java.
Voyez par vous-même :
Code en java : http://pastebin.com/9XGJBSmq
Code en C++ : http://pastebin.com/DHvfw9tG
Code en Scala : http://pastebin.com/WiyYrRDP
Donc, un petit test basique, une boucle d'un milliard d'itérations (petite différence, on a une assignation pour le code Java, parce que je connais pas particulièrement le Java et que le compilo me faisait une erreur sans)
Et là, exécution :
$ time java Test
java Test 0,22s user 0,03s system 104% cpu 0,238 total
$ time ./test
./test 9,34s user 0,01s system 99% cpu 9,400 total
$ time scala TestScala
scala TestScala 11,46s user 0,16s system 101% cpu 11,459 total
Comme vous le voyez, le Java bronche pas alors que le cpp et le scala sont bien plus longs.
Du coup, j'ai un peu de mal à comprendre d'où ça vient. De ce que j'ai pu voir, j'ai ~0.2s de chargement de la JVM quand j'exécute Java, et ~0.9s de chargement de cette même JVM+libs Scala quand j'exécute du Scala. Mais, même sans ces délais, la différence est énorme.
C'est sans doute tout bête, mais quelqu'un sait pourquoi on a une telle différence, même déjà juste entre le java et le C++ ? Et, éventuellement, avec le Scala ?
(pour le Scala, on passe à 2,2s d'exécution pour le même code si je passe -optimize au compilo, mais la compilation dure une cinquantaine de secondes au lieu des ~15 habituelles).
Bon, ça reste toujours plus rapide que de l'interprété (le code ruby ( http://pastebin.com/064rF2xu ) mets 3min
) mais ça m'étonne quand même.
Comment ça se fait que le Java bronche pas, que la boucle fasse 10 ou 1000000000 itérations, par rapport au CPP ? 