Pertanyaan bagus, saya sudah menanyakan hal itu pada diri saya akhir-akhir ini. Untuk memberi Anda angka pasti, tolok ukur di bawah ini (di Scala, dikompilasi menjadi bytecode yang hampir sama dengan kode Java yang setara):
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)
}
tersedia di sini , dilakukan pada AMD 4x 2.8 GHz dual-core dan quad-core i7 dengan hyperthreading (2.67 GHz).
Ini angkanya:
i7
Spesifikasi: Intel i7 2x quad-core @ 2,67 GHz Tes: scala.threads.ParallelTests
Nama tes: loop_heap_read
Nomor benang .: 1 Total pengujian: 200
Waktu berjalan: (menunjukkan 5 terakhir) 9.0069 9.0036 9.0017 9.0084 9.0074 (rata-rata = 9.1034 mnt = 8.9986 maks = 21.0306)
Nomor benang .: 2 Total pengujian: 200
Waktu berjalan: (menunjukkan 5 terakhir) 4,5563 4,7128 4,5663 4,5617 4,5724 (rata-rata = 4,6337 menit = 4,5509 maks = 13,9476)
Nomor benang .: 4 Total pengujian: 200
Waktu berjalan: (menampilkan 5 terakhir) 2.3946 2.3979 2.3934 2.3937 2.3964 (rata-rata = 2.5113 menit = 2.3884 max = 13.5496)
Nomor benang .: 8 Total pengujian: 200
Waktu berjalan: (menunjukkan 5 terakhir) 2.4479 2.4362 2.4323 2.4472 2.4383 (rata-rata = 2.5562 menit = 2.4166 max = 10.3726)
Nama tes: threadlocal
Nomor benang .: 1 Total pengujian: 200
Waktu berjalan: (menampilkan 5 terakhir) 91.1741 90.8978 90.6181 90.6200 90.6113 (rata-rata = 91.0291 menit = 90.6000 maks = 129.7501)
Nomor benang .: 2 Total pengujian: 200
Waktu berjalan: (menampilkan 5 terakhir) 45,3838 45,3858 45,6676 45,3772 45,3839 (rata-rata = 46,0555 menit = 45,3726 maks = 90,7108)
Nomor benang .: 4 Total pengujian: 200
Waktu berjalan: (menunjukkan 5 terakhir) 22.8118 22.8135 59.1753 22.8229 22.8172 (rata-rata = 23.9752 menit = 22.7951 maks = 59.1753)
Nomor benang .: 8 Total pengujian: 200
Waktu berjalan: (menampilkan 5 terakhir) 22.2965 22.2415 22.3438 22.3109 22.4460 (rata-rata = 23.2676 menit = 22.2346 max = 50.3583)
AMD
Spesifikasi: AMD 8220 4x dual-core @ 2,8 GHz Test: scala.threads.ParallelTests
Nama tes: loop_heap_read
Pekerjaan total: 20000000 Jumlah benang .: 1 Tes total: 200
Waktu berjalan: (menunjukkan 5 terakhir) 12,625 12,631 12,634 12,632 12,628 (rata-rata = 12,7333 menit = 12,619 maks = 26,698)
Nama tes: loop_heap_read Total pekerjaan: 20000000
Waktu berjalan: (menampilkan 5 terakhir) 6.412 6.424 6.408 6.397 6.43 (rata-rata = 6.5367 min = 6.393 max = 19.716)
Nomor benang .: 4 Total pengujian: 200
Waktu berjalan: (menunjukkan 5 terakhir) 3.385 4.298 9.7 6.535 3.385 (rata-rata = 5.6079 min = 3.354 max = 21.603)
Nomor benang .: 8 Total pengujian: 200
Waktu berjalan: (menunjukkan 5 terakhir) 5.389 5.795 10.818 3.823 3.824 (rata-rata = 5.5810 min = 2.405 max = 19.755)
Nama tes: threadlocal
Nomor benang .: 1 Total pengujian: 200
Waktu berjalan: (menampilkan 5 terakhir) 200.217 207.335 200.241 207.342 200.23 (rata-rata = 202.2424 menit = 200.184 max = 245.369)
Nomor benang .: 2 Total pengujian: 200
Waktu berjalan: (menunjukkan 5 terakhir) 100.208 100.199 100.211 103.781 100.215 (rata-rata = 102.2238 menit = 100.192 maks = 129.505)
Nomor benang .: 4 Total pengujian: 200
Waktu berjalan: (menampilkan 5 terakhir) 62.101 67.629 62.087 52.021 55.766 (rata-rata = 65.6361 menit = 50.282 max = 167.433)
Nomor benang .: 8 Total pengujian: 200
Waktu berjalan: (menunjukkan 5 terakhir) 40.672 74.301 34.434 41.549 28.119 (rata-rata = 54.7701 menit = 28.119 max = 94.424)
Ringkasan
Lokal utas sekitar 10-20x dari heap yang dibaca. Tampaknya juga berskala baik pada implementasi JVM ini dan arsitektur ini dengan jumlah prosesor.