您正在进行的计算太简单了,无法在单独的goroutine中进行每个计算。与实际计算相比,您在运行时中浪费的时间更多(创建goroutine,复用,调度等)。例如,您尝试做的事情更适合于GPU,因为您拥有大量并行执行单元,这些单元可以立即进行一次简单的计算。但是您将需要其他语言和API来做到这一点。
您可以做的是为每个执行硬件线程创建执行软件线程。您想将
max变量拆分为大块并并行执行。这是一个非常简单的例子,仅用于说明这个想法:
package mainimport ( "fmt" "math" "strconv" "time" "runtime")func main() { var input string var sum float64 var pi float64 c := make(chan float64, runtime.GOMAXPROCS(-1)) fmt.Print("How many iterations? ") fmt.Scanln(&input) max,err := strconv.Atoi(input) if err != nil { panic("You did not enter a valid integer") } start := time.Now() //start timing execution of concurrent routine for i := 0; i < runtime.GOMAXPROCS(-1); i++ { go func(i int){ var sum float64 for j := 0; j < max/runtime.GOMAXPROCS(-1); j++ { sum += chudnovskySync(j + i*max/runtime.GOMAXPROCS(-1)) } c <- sum }(i) } for i := 0; i < runtime.GOMAXPROCS(-1); i++ { sum += <-c } end := time.Now() //end of concurrent routine fmt.Println("Duration of concurrent calculation: ",end.Sub(start)) pi = 1/(12*sum) fmt.Println(pi) start = time.Now() //start timing execution of syncronous routine sum = 0 for i := 0; i < max; i++ { sum += chudnovskySync(i) } end = time.Now() //end of syncronous routine fmt.Println("Duration of synchronous calculation: ",end.Sub(start)) pi = 1/(12*sum) fmt.Println(pi)}func chudnovskySync(i int) (r float64) { var numerator float64 var denominator float64 ifloat := float64(i) iun := uint64(i) numerator = math.Pow(-1, ifloat) * float64(factorial(6*iun)) * (545140134*ifloat+13591409) denominator = float64(factorial(3*iun)) * math.Pow(float64(factorial(iun)),3) * math.Pow(math.Pow(640320,3),ifloat+0.5) r = numerator/denominator return}func factorial(n uint64) (res uint64) { if ( n > 0 ) { res = n * factorial(n-1) return res } return 1}这是结果
$ go versiongo version go1.5.2 windows/amd64$ go run main.goGOMAXPROCS = 4How many iterations? 10000Duration of concurrent calculation: 932.8916msNaNDuration of synchronous calculation: 2.0639744sNaN



