Гарне запитання, це я задавав собі нещодавно. Щоб дати вам певні цифри, наведені нижче контрольні показники (у Scala, складені практично до тих самих байт-кодів, що й еквівалентний код Java):
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)
}
доступні тут , були виконані на двоядерних процесорах AMD 4x 2,8 ГГц та чотирьохядерному i7 з гіперпотоком (2,67 ГГц).
Це цифри:
i7
Технічні характеристики: Intel i7 2x чотириядерний при тесті 2,67 ГГц: scala.threads.ParallelTests
Назва тесту: loop_heap_read
Кількість ниток: 1 Всього тестів: 200
Час роботи: (відображається останні 5) 9.0069 9.0036 9.0017 9.0084 9.0074 (в середньому = 9.1034 хв = 8.9986 макс = 21.0306)
Кількість ниток: 2 Всього тестів: 200
Тривалість роботи: (відображаються останні 5) 4,55563 4,7128 4,5663 4,5617 4,5724 (середня = 4,6337 хв = 4,5509 макс = 13,9476)
Кількість ниток: 4 Всього тестів: 200
Тривалість роботи: (відображається останні 5) 2,3946 2,3979 2,33934 2,3937 2,3964 (середня = 2,5113 хв = 2,3884 макс. = 13,5496)
Кількість ниток: 8 Всього тестів: 200
Час роботи: (відображається останні 5) 2,44479 2,4362 2,4323 2,44472 2,4383 (середнє = 2,55562 хв = 2,4166 макс = 10,3726)
Назва тесту: threadlocal
Кількість ниток: 1 Всього тестів: 200
Час роботи: (відображається останні 5) 91,1741 90,8978 90,6181 90,6200 90,6113 (в середньому = 91,0291 хв = 90,6000 макс = 129,7501)
Кількість ниток: 2 Всього тестів: 200
Час роботи: (показано останні 5) 45.3838 45.3858 45.6676 45.3772 45.3839 (середнє = 46.0555 хв = 45.3726 макс. = 90.7108)
Кількість ниток: 4 Всього тестів: 200
Час роботи: (відображається останні 5) 22.8118 22.8135 59.1753 22.8229 22.8172 (середнє = 23.9752 хв = 22.7951 макс. = 59.1753)
Кількість ниток: 8 Всього тестів: 200
Час роботи: (відображається останні 5) 22,2965 22,2415 22,3438 22,3109 22,4460 (середнє = 23,2676 хв = 22,2346 макс = 50,3583)
AMD
Технічні характеристики: AMD 8220 4x двоядерний при тесті 2,8 ГГц: scala.threads.ParallelTests
Назва тесту: loop_heap_read
Всього робіт: 20000000 Кількість ниток .: 1 Всього тестів: 200
Час роботи: (відображається останні 5) 12.625 12.631 12.634 12.632 12.628 (середнє = 12.7333 хв = 12.619 макс = 26.698)
Назва тесту: loop_heap_read Загальна робота: 20000000
Час роботи: (відображається останні 5) 6.412 6.424 6.408 6.397 6.43 (в середньому = 6.5367 хв = 6.393 макс = 19.716)
Кількість ниток: 4 Всього тестів: 200
Час роботи: (відображається останні 5) 3.385 4.298 9.7 6.535 3.385 (в середньому = 5.6079 хв = 3.354 макс = 21.603)
Кількість ниток: 8 Всього тестів: 200
Час роботи: (відображається останні 5) 5,389 5,795 10,818 3,823 3,824 (середнє = 5,5810 хв = 2,405 макс = 19,755)
Назва тесту: threadlocal
Кількість ниток: 1 Всього тестів: 200
Час роботи: (відображається останні 5) 200,217 207,335 200,241 207,342 200,23 (середнє = 202,2424 хв = 200,184 макс. = 245,369)
Кількість ниток: 2 Всього тестів: 200
Час роботи: (відображається останні 5) 100,208 100,199 100,211 103,781 100,215 (середнє = 102,2238 хв = 100,192 макс = 129,505)
Кількість ниток: 4 Всього тестів: 200
Час роботи: (показано останні 5) 62.101 67.629 62.087 52.021 55.766 (середнє = 65.6361 хв. = 50.282 макс. = 167.433)
Кількість ниток: 8 Всього тестів: 200
Час роботи: (відображається останні 5) 40.672 74.301 34.434 41.549 28.119 (середнє = 54.7701 хв. = 28.119 макс. = 94.424)
Резюме
Локальний потік приблизно в 10-20 разів більше, ніж у прочитаній купі. Здається, це також добре масштабує цю реалізацію JVM та ці архітектури з кількістю процесорів.