go:多核并行化问题
分别用串行和并行实现了一个NUM次加法的程序,代码如下:
package main import (
"fmt"
//"runtime" //执行并行段时需要引入该包
"time"
) const (
NUM = 50//+运算次数
) type vint struct {
n []int
} func (v vint) Doadd(p, i, n int, u []int, c chan int) {
for ti := i; ti < n; ti++ {
v.n[p] += u[ti]
time.Sleep(1 * time.Second)
}
c <- 1
return
}
func (v vint) Doall(ncpu int, u []int) (sum int) {
c := make(chan int, ncpu)
var segment int
if NUM%ncpu == 0 {
segment = NUM / ncpu
} else {
segment = NUM / (ncpu - 1)
} for i := 0; i < ncpu; i++ {
start := i * segment
temp := start + segment
var end int
if temp < NUM {
end = temp
} else {
end = NUM
}
go v.Doadd(i, start, end, 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()
sum := 0
for i := 0; i < NUM; i++ {
sum += u[i]
time.Sleep(1 * time.Second)
}
te := time.Now().UnixNano()
fmt.Println((te - ts)) return
}
1亿*1000次(1亿次运算,重复1000次)的串行和并行执行的结果如下:
8核并行化时间: 105026.076ms 串行时间: 80704.4503ms
由结果可知,并行化的时间开销反而比串行大。
--------------------------------------------15/11/02更新---------------------------------------------
作者:赵雪松
链接:http://www.zhihu.com/question/37061750/answer/70294889
不请自来,go的并发主要是用来解决网络io等慢设备访问的等待问题的,而内存恰恰不属于这个部分。
并行:7001.918ms(≈7s)
go:多核并行化问题的更多相关文章
- GO语言(七)多核并行化的问题
package main import "fmt" type Vector []float64 func (v Vector) DoSome(i,n int, u Vector, ...
- go语言入门
Go语言最主要的特性: 自动垃圾回收 更丰富的内置类型 函数多返回值 错误处理 匿名函数和闭包 类型和接口 并发编程 反射 语言交互性 1.2.4 错误处理Go语言引入了3个关键字用 ...
- Go语言编程 (许式伟 等 著)
第1章 初识Go语言 1.1 语言简史 1.2 语言特性 1.2.1 自动垃圾回收 1.2.2 更丰富的内置类型 1.2.3 函数多返回值 1.2.4 错误处理 1.2.5 匿名函数和闭包 1.2.6 ...
- Go并发编程(四)
并发基础 多进程 多线程 基于回调的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭, ...
- Golang 实现守护主进程
package main import ( "fmt" "runtime" "sync" "time" ) func t ...
- Go语言并发编程总结
转自:http://blog.csdn.net/yue7603835/article/details/44309409 Golang :不要通过共享内存来通信,而应该通过通信来共享内存.这句风靡在Go ...
- Go程序设计3——并发编程
1 channel 一般channel的声明形式为: var chanName chan ElementType 与一般的变量声明不同的地方仅仅是在类型之前增加了chan关键字.ElementType ...
- 09. Go 语言并发
Go 语言并发 并发指在同一时间内可以执行多个任务.并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等.本章讲解的并发含义属于多线程编程. Go 语言通过编译器运行时(runtime),从 ...
- 剖析虚幻渲染体系(14)- 延展篇:现代渲染引擎演变史Part 1(萌芽期)
目录 14.1 本篇概述 14.1.1 游戏引擎简介 14.1.2 游戏引擎模块 14.1.3 游戏引擎列表 14.1.3.1 Unreal Engine 14.1.3.2 Unity 14.1.3. ...
随机推荐
- 解决java.net.MalformedURLException: unknown protocol: c问题
修改前代码: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builde ...
- 看完这篇让你对各种前端build工具不再懵逼!
本文原标题为:我终于弄懂了各种前端build工具 译者:@Christian 译文:https://www.sdk.cn/news/5412 原文:https://medium.freecodecam ...
- NSRunLoop的进一步理解
iPhone应用开发中关于NSRunLoop的概述是本文要介绍的内容,NSRunLoop是一种更加高明的消息处理模式,他就高明在对消息处理过程进行了更好的抽象和封装,这样才能是的你不用处理一些很琐碎很 ...
- Android 轮换控件
首先是控件轮换 一.创建主布局 1.用到的控件是 TextSwitcher (文本轮换) 那么其他对应的也就是 ImageSwitcher (图片轮换) <LinearLayout xmlns: ...
- ubuntu下载工具uget和aria2
一直想在ubuntu下找到个和迅雷差不多的下载工具.在网上找到了. 这篇文章完全是抄袭整理网上的. 我的系统版本是ubuntu14.04. 1.安装uget和aria2 sudo apt-get in ...
- Install ArchLinux(draft)
1.# dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync 2. # timedatectl ...
- bat基础
首先所有命令在cmd命令行中都能找到说明: 例如 想知道type用法 输入type /? 其他命令都一样 type [drive:][path] filename 显示文本文件内容 虽然有点鸡肋 1 ...
- Web Service简要概念,学习记录!
Web Service平台需要一套协议来实现分布式应用程序的创建.任何平台都有它的数据表示方法和类型系统.要实现互操作性,Web Service平台必须提供一套标准的类型系统,用于沟通不同平台.编程语 ...
- confirm对话框取消后阻止ajax操作、ajax做批量删除
在做批量删除的时候,需要用confirm弹出一个提示框让用户确认是否删除,点击确定,执行操作,点击取消,取消操作.但是如果使用ajax把选中项的主键值传到处理页面处理时,如果使用下面的方法将confi ...
- mysql 数据类型
1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) ...