标签:
分别用串行和并行实现了一个1亿*1000次加法的程序,代码如下:
package main
import (
"fmt"
//"runtime"//执行并行段时需要引入该包
"time"
)
const (
NUM = 100000000
)
type vint struct {
n []int
}
func (v vint) Doadd(p, i, n int, u []int, c chan int) {
tempv=v.n[p]
for j := 0; j < 1000; j++ {
for ti := i; ti < n; ti++ {
v.n[p] += u[ti]
}
v.n[p]=tempv//重置v.n[p]
}
c <- 1
return
}
func (v vint) Doall(ncpu int, u []int) (sum int) {
c := make(chan int, ncpu)
segment := NUM / ncpu
for i := 0; i < ncpu; i++ {
go v.Doadd(i, i*segment, (i+1)*segment, u, c)
}
for i := 0; i < ncpu; i++ {
<-c
}
for i := 0; i < ncpu; i++ {
sum += v.n[i]
}
return
}
func main() {
/*并行段
ncpu := runtime.NumCPU()
runtime.GOMAXPROCS(ncpu)
u := make([]int, NUM)
for i := 0; i < NUM; i++ {
u[i] = 1
}
v := new(vint)
v.n = make([]int, ncpu)
ts := time.Now().UnixNano()
sum := v.Doall(ncpu, u)
te := time.Now().UnixNano()
fmt.Println((te - ts), sum)*/
//串行段
u := make([]int, NUM)
for i := 0; i < NUM; i++ {
u[i] = 1
}
ts := time.Now().UnixNano()
for j := 0; j < 1000; j++ {
sum := 0
for i := 0; i < NUM; i++ {
sum += u[i]
}
}
te := time.Now().UnixNano()
fmt.Println((te - ts))
return
}
串行和并行执行的结果如下:
8核并行化时间: 105026.076ms 串行时间: 80704.4503ms

由结果可知,并行化的时间开销反而比串行大,若各位知道原因,希望能在评论区回复解答
标签:
原文地址:http://www.cnblogs.com/xiaopipi/p/4925045.html