良い質問です、私は最近それを自問しています。明確な数値を提供するために、以下のベンチマーク(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 GHzデュアルコアおよびハイパースレッディング(2.67 GHz)を備えたクアッドコアi7で実行されました。
これらは数字です:
i7
仕様:Inteli72xクアッドコア@2.67GHzテスト:scala.threads.ParallelTests
テスト名:loop_heap_read
スレッド番号:1合計テスト:200
実行時間:(最後の5つを表示)9.0069 9.0036 9.0017 9.0084 9.0074(avg = 9.1034 min = 8.9986 max = 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
仕様:AMD82204xデュアルコア@2.8GHzテスト:scala.threads.ParallelTests
テスト名:loop_heap_read
総作業量:20000000スレッド数:1総テスト数:200
実行時間:(最後の5つを表示)12.625 12.631 12.634 12.632 12.628(avg = 12.7333 min = 12.619 max = 26.698)
テスト名:loop_heap_read総作業量:20000000
実行時間:(最後の5つを表示)6.412 6.424 6.408 6.397 6.43(avg =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(avg = 202.2424 min = 200.184 max = 245.369)
スレッド番号:2合計テスト:200
実行時間:(最後の5つを表示)100.208 100.199 100.211 103.781 100.215(avg = 102.2238 min = 100.192 max = 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実装と、プロセッサの数に応じたこれらのアーキテクチャで適切に拡張できるようです。