Bonne question, je me suis posé la question récemment. Pour vous donner des chiffres précis, les benchmarks ci-dessous (en Scala, compilés avec pratiquement les mêmes bytecodes que le code Java équivalent):
var cnt: String = ""
val tlocal = new java.lang.ThreadLocal[String] {
override def initialValue = ""
}
def loop_heap_write = {
var i = 0
val until = totalwork / threadnum
while (i < until) {
if (cnt ne "") cnt = "!"
i += 1
}
cnt
}
def threadlocal = {
var i = 0
val until = totalwork / threadnum
while (i < until) {
if (tlocal.get eq null) i = until + i + 1
i += 1
}
if (i > until) println("thread local value was null " + i)
}
disponibles ici , ont été réalisées sur un AMD 4x 2,8 GHz dual-core et un quad-core i7 avec hyperthreading (2,67 GHz).
Voici les chiffres:
i7
Spécifications: Intel i7 2x quad-core @ 2,67 GHz Test: scala.threads.ParallelTests
Nom du test: loop_heap_read
Numéro de la discussion: 1 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 9,0069 9,0036 9,0017 9,0084 9,0074 (moy = 9,1034 min = 8,9986 max = 21,0306)
Numéro de la discussion: 2 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 4,5563 4,7128 4,5663 4,5617 4,5724 (moy = 4,6337 min = 4,5509 max = 13,9476)
Numéro de la discussion: 4 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 2,3946 2,3979 2,3934 2,3937 2,3964 (moy = 2,5113 min = 2,3884 max = 13,5496)
Numéro de la discussion: 8 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 2,4479 2,4362 2,4323 2,4472 2,4383 (moy = 2,5562 min = 2,4166 max = 10,3726)
Nom du test: threadlocal
Numéro de la discussion: 1 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 91,1741 90,8978 90,6181 90,6200 90,6113 (moy = 91,0291 min = 90,6000 max = 129,7501)
Numéro de la discussion: 2 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 45,3838 45,3858 45,6676 45,3772 45,3839 (moy = 46,0555 min = 45,3726 max = 90,7108)
Numéro de la discussion: 4 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 22.8118 22.8135 59.1753 22.8229 22.8172 (moy = 23.9752 min = 22.7951 max = 59.1753)
Numéro de la discussion: 8 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 22,2965 22,2415 22,3438 22,3109 22,4460 (moy = 23,2676 min = 22,2346 max = 50,3583)
AMD
Spécifications: AMD 8220 4x dual-core @ 2.8 GHz Test: scala.threads.ParallelTests
Nom du test: loop_heap_read
Travail total: 20000000 N ° de la discussion: 1 Total des tests: 200
Temps de fonctionnement: (montrant les 5 derniers) 12,625 12,631 12,634 12,632 12,628 (moy = 12,7333 min = 12,619 max = 26,698)
Nom du test: loop_heap_read Travail total: 20000000
Temps d'exécution: (montrant les 5 derniers) 6,412 6,424 6,408 6,397 6,43 (moy = 6,5367 min = 6,393 max = 19,716)
Numéro de la discussion: 4 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 3,385 4,298 9,7 6,535 3,385 (moy = 5,6079 min = 3,354 max = 21,603)
Numéro de la discussion: 8 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 5,389 5,795 10,818 3,823 3,824 (moy = 5,5810 min = 2,405 max = 19,755)
Nom du test: threadlocal
Numéro de la discussion: 1 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 200,217 207,335 200,241 207,342 200,23 (moy = 202,2424 min = 200,184 max = 245,369)
Numéro de la discussion: 2 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 100,208 100,199 100,211 103,781 100,215 (moy = 102,2238 min = 100,192 max = 129,505)
Numéro de la discussion: 4 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 62,101 67,629 62,087 52,021 55,766 (moy = 65,6361 min = 50,282 max = 167,433)
Numéro de la discussion: 8 Total des tests: 200
Temps d'exécution: (montrant les 5 derniers) 40,672 74,301 34,434 41,549 28,119 (moy = 54,7701 min = 28,119 max = 94,424)
Sommaire
Un thread local est environ 10 à 20 fois celui de la lecture du tas. Il semble également bien évoluer sur cette implémentation JVM et ces architectures avec le nombre de processeurs.