先看下源**,預想從1至n總取出所有能被a或b整除的正整數之和,為了利用go語言的並行優勢,特使用goroute特性來實現,同時使用普通順序計算進行效率比較分析
package changoimport (
"fmt"
"time"
)func get_sum_of_divisible(num int64, divider int64, resultchan chan int64)
}resultchan <- sum
}func zhengchu_testing(limit int64, one int64, two int64)
if value%two == 0
if value%three == 0
}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包沒有語法毛病,但是實際測試發現,顯然通過順序計算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 changoimport (
"fmt"
"time"
)func get_sum_of_divisible(num int64, divider int64, resultchan chan int64)
}resultchan <- sum
}func zhenchu_testing(limit int64, one int64, two int64)
var ch [3](chan int64)
for i := 0; i < 3; i++
t_start := time.now()
for i:=0;i<3;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%two == 0
if value%three == 0
}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的並行出來優勢沒有發揮出來,
測試列印輸出如下:78當n=20
63 30 15
testing times1:33.557µs
78testing times2:2.382µs
當n的數值很大的情況下,如100000000,goroute的平行計算優勢就發揮出來了!測試列印輸出如下:
2333333316666668
1666666683333333 999999950000000 333333316666665
testing times1:1.574445477s
2333333316666668
testing times2:2.199982414s
go語言之goroute協程
goroute協程 程序和執行緒 程序是系統進行資源分配和排程的基本單位,執行緒是cpu排程和發派的基本單位,乙個程序可以建立和撤銷多個執行緒 併發和並行 多執行緒程式在乙個核的cpu上面執行,是併發 多執行緒程式在多個核的cpu上面執行,這是並行 協程和執行緒 協程 獨立的棧空間,共享的堆記憶體,...
Go語言中使用JSON
encode 將乙個物件編碼成json資料,接受乙個inte ce 物件,返回byte和error func marshal v inte ce byte,error marshal函式將會遞迴遍歷整個物件,依次按成員型別對這個物件進行編碼,型別轉換規則如下 bool型別 轉換為json的boole...
Go語言中defer的使用
func print a int func add a,b int int fmt.println add 4,3 上面這段 defer語句輸出的是4,add返回的值是7。defer可以用於檔案的開啟和關閉,鎖的開啟和關閉。package ioutil func readfile filename ...