เป็นคำถามที่ดีฉันถามตัวเองเมื่อเร็ว ๆ นี้ เพื่อให้คุณได้ตัวเลขที่ชัดเจนเกณฑ์มาตรฐานด้านล่าง (ใน 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 dual-cores และ quad-core i7 พร้อมไฮเปอร์เธรด (2.67 GHz)
นี่คือตัวเลข:
i7
ข้อมูลจำเพาะ: Intel i7 2x quad-core @ 2.67 GHz Test: 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 dual-core @ 2.8 GHz Test: 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-20x ของฮีปที่อ่าน ดูเหมือนว่าจะปรับขนาดได้ดีในการนำ JVM นี้ไปใช้และสถาปัตยกรรมเหล่านี้ด้วยจำนวนโปรเซสเซอร์