2017-03-21 4 views
0

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") 
    } 
} 

答えて

0

それは関数呼び出しの少数を並列化するのにかかるワークロードが、それは順番に実行するのにかかるよりも多くのことができます。しかし、たとえば、非常に大きな数値のフィボナッチと呼ばれる場合は、これが変わる可能性があります。

関連する問題