Хороший вопрос, я спрашивал себя об этом недавно. Чтобы дать вам определенные числа, приведенные ниже тесты (в 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 ГГц).
Вот цифры:
1010 * 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,5553 4,7128 4,5663 4,5617 4,5724 (среднее = 4,6337 мин = 4,5509 макс = 13,9476)
Номер резьбы: 4
Всего тестов: 200
Время выполнения: (показаны последние 5)
2,3946 2,3979 2,3934 2,3937 2,3964 (средн. 2,5113 мин. = 2,3884 макс. = 13,5496)
Номер темы: 8
Всего тестов: 200
Время выполнения: (показаны последние 5)
2,4479 2,4362 2,4323 2,4472 2,4383 (среднее = 2,5552 мин = 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,304 макс = 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, и для этих архитектур с числом процессоров.