i7-2960xm(4コアハイパースレッディング)でマルチスレッドを試しているときに、Groovy Gparsのパフォーマンスが予想より悪くなっています。私のテストでは、私は、ワークロードをシミュレートするために、再帰的なFIB計算機を使用してきました:Groovy Gparsのパフォーマンスがシリアルと比較して劣る
def fibRecursive(int index) {
if (index == 0 || index == 1) {
return index
}
else {
return fibRecursive(index - 2) + fibRecursive(index - 1)
}
}
Gparsをテストするために、私は現在、次のコードを使用しています:並列にfib(36)
を計算
def nums = [36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36]
GParsPool.withPool(4) {
nums.eachParallel {
SplitTimer internalTimer = new SplitTimer()
println("fibRecursive(${it}): ${fibRecursive(it)}")
internalTimer.split("fibRecursive(${it})")
for (instance in internalTimer.splitTimes) {
println(instance)
}
}
}
が出回っ1.9秒かかりますwithPool(4)
。 withPool(1)
私はGparsの外の関数を呼び出すと少し似だろうと仮定しかし、それはわずか0.4秒かかるの周りに1.4秒、例えばかかる:私はパフォーマンスヒットのこの種を経験するかもしれない理由
nums.each {
SplitTimer internalTimer = new SplitTimer()
println("fibRecursive(${it}): ${fibRecursive(it)}")
internalTimer.split("fibRecursive(${it})")
for (instance in internalTimer.splitTimes) {
println(instance)
}
}
を誰かが説明してもらえますか?ありがとう!ここで
は、念のために私のSplitTimerです:
class SplitTimer {
long initialTime
int instances = 0
class Instance {
int index
String name
long time
def elapsed() {
return time - initialTime
}
def Instance(String instanceName) {
this.index = this.instances++
this.name = instanceName
this.time = System.nanoTime()
}
String toString() {
return "[Instance ${this.index}: \"${this.name}\" (${Formatter.elapsed(this.elapsed())} elapsed)]"
}
}
def splitTimes = []
def SplitTimer() {
def initialInstance = new Instance("Start")
this.initialTime = initialInstance.time
splitTimes.add(initialInstance)
}
def split(String instanceName) {
splitTimes.add(new Instance(instanceName))
}
}
class Formatter {
static int hours
static int minutes
static int seconds
static int nanoseconds
static setValues(time) {
nanoseconds = time % 10**9
seconds = time/10**9
minutes = seconds/60
hours = minutes/60
seconds %= 60
minutes %= 60
}
static elapsed(time) {
setValues(time)
return "${hours}:" + "${minutes}:".padLeft(3, "0") + "${seconds}.".padLeft(3, "0") + "${nanoseconds}".padLeft(9,"0")
}
static absolute(time) {
setValues(time)
hours %= 24
return "${hours}:".padLeft(3, "0") + "${minutes}:".padLeft(3, "0") + "${seconds}.".padLeft(3, "0") + "${nanoseconds}".padLeft(9,"0")
}
}