Güzel soru, son zamanlarda kendime soruyordum. Size kesin sayılar vermek için, aşağıdaki kriterler (Scala'da, eşdeğer Java koduyla hemen hemen aynı bayt kodlarına göre derlenmiştir):
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)
}
burada mevcut , bir AMD 4x 2.8 GHz çift çekirdekli ve hiper iş parçacıklı (2.67 GHz) dört çekirdekli bir i7 üzerinde gerçekleştirildi.
Sayılar şunlardır:
i7
Özellikler: Intel i7 2x dört çekirdekli @ 2.67 GHz Test: scala.threads.ParallelTests
Test adı: loop_heap_read
Konu numarası: 1 Toplam testler: 200
Çalışma süreleri: (son 5'i göstererek) 9.0069 9.0036 9.0017 9.0084 9.0074 (ortalama = 9.1034 dk = 8.9986 maks = 21.0306)
İplik numarası: 2 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 4.5563 4.7128 4.5663 4.5617 4.5724 (ortalama = 4.6337 dk = 4.5509 maks = 13.9476)
İplik numarası: 4 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 2.3946 2.3979 2.3934 2.3937 2.3964 (ortalama = 2.5113 dk = 2.3884 maks = 13.5496)
İplik numarası: 8 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 2,4479 2,4362 2,4323 2,4472 2,4383 (ortalama = 2,5562 dk = 2,4166 maks = 10,3726)
Test adı: threadlocal
Konu numarası: 1 Toplam testler: 200
Çalışma süreleri: (son 5'i göstererek) 91.1741 90.8978 90.6181 90.6200 90.6113 (ortalama = 91.0291 dk = 90.6000 maks = 129.7501)
İplik numarası: 2 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 45.3838 45.3858 45.6676 45.3772 45.3839 (ortalama = 46.0555 dk = 45.3726 maks = 90.7108)
İplik numarası: 4 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 22.8118 22.8135 59.1753 22.8229 22.8172 (ortalama = 23.9752 dk = 22.7951 maks = 59.1753)
İplik numarası: 8 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 22.2965 22.2415 22.3438 22.3109 22.4460 (ortalama = 23.2676 dk = 22.2346 maks = 50.3583)
AMD
Özellikler: AMD 8220 4x çift çekirdekli @ 2.8 GHz Test: scala.threads.ParallelTests
Test adı: loop_heap_read
Toplam iş: 20000000 İplik numarası: 1 Toplam testler: 200
Çalışma süreleri: (son 5'i göstererek) 12.625 12.631 12.634 12.632 12.628 (ortalama = 12.7333 dk = 12.619 maks = 26.698)
Test adı: loop_heap_read Toplam çalışma: 20000000
Çalışma süreleri: (son 5'i göstererek) 6.412 6.424 6.408 6.397 6.43 (ortalama = 6.5367 min = 6.393 maks = 19.716)
İplik numarası: 4 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 3.385 4.298 9.7 6.535 3.385 (ort = 5.6079 dk = 3.354 maks = 21.603)
İplik numarası: 8 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 5.389 5.795 10.818 3.823 3.824 (ortalama = 5.5810 dk = 2.405 maks = 19.755)
Test adı: threadlocal
Konu numarası: 1 Toplam testler: 200
Çalışma süreleri: (son 5'i göstererek) 200.217 207.335 200.241 207.342 200.23 (ortalama = 202.2424 dk = 200.184 maks = 245.369)
İplik numarası: 2 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 100.208 100.199 100.211 103.781 100.215 (ortalama = 102.2238 dk = 100.192 maks = 129.505)
İplik numarası: 4 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 62.101 67.629 62.087 52.021 55.766 (ortalama = 65.6361 dk = 50.282 maks = 167.433)
İplik numarası: 8 Toplam test: 200
Çalışma süreleri: (son 5'i göstererek) 40.672 74.301 34.434 41.549 28.119 (ort = 54.7701 dk = 28.119 maks = 94.424)
Özet
Yerel bir iş parçacığı, okunan yığının yaklaşık 10-20x'idir. Ayrıca, bu JVM uygulamasında ve bu mimarilerde işlemci sayısıyla iyi bir şekilde ölçekleniyor gibi görünüyor.