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. ...
随机推荐
- WCF、Web API、WCF REST、Web Service比较
原文地址:http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and- ...
- POJ 3422 Kaka's Matrix Travels
Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9567 Accepted: ...
- 【bzoj4008】 HNOI2015—亚瑟王
http://www.lydsy.com/JudgeOnline/problem.php?id=4008 (题目链接) 题意 给出n个技能,每个技能按顺序有p[i]的可能性释放,可以造成d[i]的伤害 ...
- 【原创】自己动手写控件----XSmartNote控件
一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...
- 查看 SHA1
keytool -v -list -keystore C:\Users\tianyingzhong\.android\debug.keystore 输入密钥库口令: android android
- R 单变量重命名与删除
单变量重命名 b = rename(b,c(target="flag")) 单变量删除 b = b[,names(b)!='age'] 或者 b[,"age&quo ...
- 三、基于hadoop的nginx访问日志分析--计算时刻pv
代码: # cat pv_hour.py #!/usr/bin/env python # coding=utf-8 from mrjob.job import MRJob from nginx_acc ...
- vector it->和*it
//每次写代码总是被迭代器的iter->和*iter弄晕,主要是被protobuf弄晕了 #include <vector> struct test{ test(){ memset( ...
- 关于elasticsearch和kibana的时区和日期问题
elasticsearch原生支持date类型,json格式通过字符来表示date类型.所以在用json提交日期至elasticsearch的时候,es会隐式转换,把es认为是date类型的字符串直接 ...
- express之sendFile
module.exports = function(req, res, opt) { var applyNo = req.query.applyNo; console.log("applyN ...