Je fonctionne sur un ordinateur 32 bits Debian 6.0 (Squeeze) (un système à 2,5 GHz). Core 2 CPU), sun-java6 6.24-1 mais avec les paquets Scala 2.8.1 de Wheezy.
Ce code, compilé avec scalac -optimise
prend plus de 30 secondes pour fonctionner :
object Performance {
import scala.annotation.tailrec
@tailrec def gcd(x:Int,y:Int):Int = {
if (x == 0)
y
else
gcd(y%x,x)
}
val p = 1009
val q = 3643
val t = (p-1)*(q-1)
val es = (2 until t).filter(gcd(_,t) == 1)
def main(args:Array[String]) {
println(es.length)
}
}
Mais si je fais le changement trivial de déplacer le val es=
une ligne plus bas et à l'intérieur de la portée de main
Il s'exécute alors en une seconde seulement, ce qui est beaucoup plus conforme à ce que j'attendais et comparable aux performances d'un C++ équivalent. Il est intéressant de noter qu'en laissant le val es=
où il est, mais en le qualifiant de lazy
a également le même effet accélérateur.
Qu'est-ce qui se passe ici ? Pourquoi l'exécution du calcul en dehors de la portée de la fonction est-elle tellement plus lente ?