良い質問です、私は最近それを自問しています。明確な数値を提供するために、以下のベンチマーク(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
仕様:Intel i72xクアッドコア@ 2.67 GHzテスト:scala.threads.ParallelTests
テスト名:loop_heap_read
スレッド番号:1合計テスト:200
実行時間:(最後の5つを表示)9.069 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 82204xデュアルコア@ 2.8 GHzテスト: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実装と、プロセッサの数に応じたこれらのアーキテクチャでも適切に拡張できるようです。