좋은 질문입니다. 최근에 스스로에게 물어 보았습니다. 명확한 숫자를 제공하기 위해 아래 벤치 마크 (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.8GHz 듀얼 코어 및 하이퍼 스레딩 (2.67GHz)이있는 쿼드 코어 i7에서 수행되었습니다.
다음은 숫자입니다.
i7
사양 : Intel i7 2x 쿼드 코어 @ 2.67GHz 테스트 : 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.5563 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.5562 최소 = 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.8GHz 테스트 : 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 구현과 프로세서 수에 따라 이러한 아키텍처에서 잘 확장되는 것으로 보입니다.