先看下源代码,预想从1至N总取出所有能被a或b整除的正整数之和,为了利用go语言的并行优势,特使用goroute特性来实现,同时使用普通顺序计算进行效率比较分析

package chango

import (
"fmt"
"time"
) func get_sum_of_divisible(num int64, divider int64, resultChan chan int64) {
var sum int64 = 0
var value int64
for value = 1; value < num; value++ {
if value%divider == 0 {
sum += value
}
}
resultChan <- sum
}
func Zhengchu_testing(limit int64, one int64, two int64) {
resultchan := make(chan int64, 3)
var three int64
three = one * two t_start := time.Now() go get_sum_of_divisible(limit, one, resultchan)
go get_sum_of_divisible(limit, two, resultchan)
go get_sum_of_divisible(limit, three, resultchan) one_sum, two_sum, three_sum := <-resultchan, <-resultchan, <-resultchan var sum int64
var value int64
sum = one_sum + two_sum - three_sum fmt.Println(sum)
t_end := time.Now()
fmt.Println(one_sum, two_sum, three_sum)
fmt.Printf("testing times1:%v\n", t_end.Sub(t_start)) sum = 0
t_start = time.Now() for value = 1; value < limit; value++ {
if value%one == 0 {
sum += value }
if value%two == 0 {
sum += value
}
if value%three == 0 {
sum -= value
}
}
fmt.Println(sum)
t_end = time.Now()
fmt.Printf("testing times2:%v\n", t_end.Sub(t_start))
}
然后在main包中调用该chango包
package main import "./chango" func main(){ chango.Zhengchu_testing(10,3,5)
}

初看上去,chango包没有语法毛病,但是实际测试发现,显然通过顺序计算10以内能被3或5整除的所有正整数分别为3,5,6,9,他们之和应该为23,能被3整数的整数之和为3+6+9=18,能被5整除的正整数之和为5,能被3*15=15的正整数之和为0
而通过goroute计算10以内能被3或5整除的所有正整数之和却不是23,而是-13或13,这又是为什么呢?
通过调试发现,问题就出现在“:=”语句中
  one_sum, two_sum, three_sum := <-resultchan, <-resultchan, <-resultchan
多次运行
通过分别打印能被3或5或3*5=15的正整数之和,他们的结果竟然是0,18,5或0,5,18,这个结果竟然不唯一

既然是这个语句有问题,此路不通,暂时绕道行之

于是修改源代码如下:
package chango

import (
"fmt"
"time"
) func get_sum_of_divisible(num int64, divider int64, resultChan chan int64) {
var sum int64 = 0
var value int64
for value = 1; value < num; value++ {
if value%divider == 0 {
sum += value
}
}
resultChan <- sum
}
func Zhenchu_testing(limit int64, one int64, two int64) {
   var three int64
three = one * two
numbers:=[3]int64{one,two,three}

   var ch [3](chan int64)
for i := 0; i < 3; i++ {
ch[i] = make(chan int64)
}
t_start := time.Now()
for i:=0;i<3;i++{
go get_sum_of_divisible(limit, numbers[i], ch[i])
} one_sum:=<-ch[0]
two_sum:=<-ch[1]
three_sum:=<-ch[2]
var sum int64
var value int64
sum = one_sum + two_sum - three_sum fmt.Println(sum)
t_end := time.Now()
fmt.Println(one_sum, two_sum, three_sum)
fmt.Printf("testing times1:%v\n", t_end.Sub(t_start)) sum = 0
t_start = time.Now() for value = 1; value < limit; value++ {
if value%one == 0 {
sum += value }
if value%two == 0 {
sum += value
}
if value%three == 0 {
sum -= value
} }
fmt.Println(sum)
t_end = time.Now()
fmt.Printf("testing times2:%v\n", t_end.Sub(t_start))
} 这下在main包中调用该chango包通过! 结下来分析goroute同普通顺序计算进行效率比较分析,开始当计算从1至N总取出所有能被a或b整除的正整数之和中N的N的数值比较小的情况下,goroute的并行出来优势没有发挥出来,
测试打印输出如下:
当N=20

78 
  63 30 15
  testing times1:33.557µs
  78
  testing times2:2.382µs

当N的数值很大的情况下,如100000000,goroute的并行计算优势就发挥出来了!

测试打印输出如下:
  2333333316666668
  1666666683333333 999999950000000 333333316666665
  testing times1:1.574445477s
  2333333316666668
  testing times2:2.199982414s


参考学习资料


												

go语言中goroute使用:=遇到的坑的更多相关文章

  1. Go语言中slice使用注意事项

    Go 语言中的slice类型可以理解为是数组array类型的描述符,包含了三个因素: 指向底层数组的指针 slice目前使用到的底层数组的元素个数,即长度 底层数组的最大长度,即容量 因此当我们定义一 ...

  2. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  3. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

  4. c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  5. C语言中do...while(0)的妙用(转载)

    转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...

  6. C语言中,定义的含义?声明的含义?它们之间的区别是什么?

    在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名 ...

  7. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

  8. C语言中qsort函数用法

    C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

  9. c语言中time相关函数

    工作中遇到的函数: int seed = time(NULL); srand(seed); signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); 搜time ...

随机推荐

  1. 最小费用流(km的另一种使用思路)

    题目链接:https://cn.vjudge.net/contest/242366#problem/L 大体意思就是:h代表旅馆,m代表人,人每走动一个需要一个金币,行动只有两个方向,水平或者竖直.问 ...

  2. I - Interesting Calculator (bfs使用优先队列求步数最小或者花费最小)

    题目链接:https://cn.vjudge.net/contest/245287#problem/I 代码: 使用普通的队列和优先队列相比,优先队列能更快地找到目的变量. #include<i ...

  3. 改变checkbox的默认样式

    针对于CheckBox默认样式的改变,和选中状态的改变 <label class="checkBox"><input type="checkbox&qu ...

  4. GPIO接口解析【转】

    本文提供了一个linux下访问GPIO的约定的概述. 这些调用使用gpio_* 命名前缀.没有别的调用会使用这个前缀或是相关的__gpio_*前缀. 转自:http://blog.163.com/w5 ...

  5. 存储器结构、cache、DMA架构分析--【原创】

    存储器的层次结构       高速缓冲存储器  cache   读cache操作     cache如果包含数据就直接从cache中读出来,因为cache速度要比内存快 如果没有包含的话,就从内存中找 ...

  6. cacti系列(一)之cacti的安装及配置监控mysql服务

    简介 Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数.它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构 ...

  7. Expm 7_1树中的最大独立集问题

    [问题描述] 给定一个无回路的无向图(即树),设计一个动态规划算法,求出该图的最大独立集,并输出该集合中的各个顶点值. package org.xiu68.exp.exp7; import java. ...

  8. ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061),mysql服务已启动

    1 前言 在mysql服务已启动,用命令行进入或者heidisql工具都提示ERROR 2003 (HY000): Can't connect to MySQL server on 'localhos ...

  9. PYTHON-面向对象 继承 派生

    1. 什么是继承 继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承有3个特点: 1. 子类可以遗传/重用父类的属性(解决类与类之间代码冗余的问题) 2. 在p ...

  10. WPF设置对象隐藏、不可用

    设置隐藏时,这里将控件分为两类, 1.普通的按钮.下拉框等,根据控件的Name进行查找,设置IsEnabled为false; 2.ListView中嵌套控件,直接将列隐藏,根据GridViewColu ...