2017-03-21 5 views
0

i7-2960xm (4 코어 하이퍼 스레딩)에서 멀티 스레딩을 실험하는 동안 Groovy Gpars의 예상 성능이 저하되고 있습니다.Groovy Gpars가 병렬과 비교하여 성능이 좋지 않음

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

병렬 fib(36)가 약 1.9 초 걸리는 계산 :

def fibRecursive(int index) { 
    if (index == 0 || index == 1) { 
     return index 
    } 
    else { 
     return fibRecursive(index - 2) + fibRecursive(index - 1) 
    } 
} 

내가 현재 다음과 같은 코드를 사용하고 Gpars를 테스트하려면 : 내 테스트에서 나는 부하를 시뮬레이션하기 위해 재귀 FIB 계산기를 사용하고 withPool(4). withPool(1) 주위 내가 Gpars의 외부 함수를 호출 다소 유사하다 가정 1.4 초 정도 걸립니다하지만 0.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

그것이 순차적으로 실행하는 데 걸리는보다 함수 호출의 작은 숫자가 더있을 수 병렬화하는 데 소요되는 작업. 그러나, 예를 들어 피보나치를 매우 큰 숫자로 불렀을 때, 이것은 바뀔 수 있습니다.