因為剛好看到 go1.5b2 已完成 9x%,想說就抓下來試一下
意外發現 1.5b2 編出來的碼執行效能真的快了不少
這是我原來用的測試碼:
package main
import (
"fmt"
"sync"
"runtime"
)
const loopMax = 100000
var wg sync.WaitGroup
var goCount, allDone int64 = 0, 0
var c chan bool = make(chan bool, 1)
func addCount() {
defer wg.Done()
for ok := range c {
if ok {
goCount++
}
if allDone == 0 {
close(c)
}
}
}
func func1(id int) {
defer wg.Done();
//defer close(c)
var str1, str2 string = "在資料序列(Data sequence)中隨機找一元素為定界點(Pivot)," +
"然後讓序列的其他元素與定界點比較,比定界點小的元素放左邊,大的放右邊。在定界點左邊子序列" +
"和右邊子序列,再以相同的方式處理,直到整個序列排序完畢。", ""
for idx:=0; idx<loopMax; idx++ {
str2 = fmt.Sprintf("[%v]%v", id, str1)
c <- true
}
allDone--
fmt.Println(str2)
}
func main() {
//runtime.GOMAXPROCS(2)
runtime.GOMAXPROCS(runtime.NumCPU())
allDone = 4
for idx:=0; idx<4; idx++ {
wg.Add(1)
go func1(idx)
}
defer func() {
fmt.Println(goCount)
}()
wg.Add(1)
go addCount()
wg.Wait()
}
開4個 goroutine 加 4核心來跑,結果如下
$ go version
go version go1.4.2 linux/amd64
$ go build -o ex022-01 ex022.go
$ go version
go version go1.5beta2 linux/amd64
$ go build -o ex022-02 ex022.go
$ time ./ex022-01 && time ./ex022-02
[3]在資料序列(Data sequence)中隨機找一元素為定界點(Pivot),然後讓序.....
[2]在資料序列(Data sequence)中隨機找一元素為定界點(Pivot),然後讓序.....
[1]在資料序列(Data sequence)中隨機找一元素為定界點(Pivot),然後讓序.....
[ 0 ]在資料序列(Data sequence)中隨機找一元素為定界點(Pivot),然後讓序.....
400000
real 0m3.922s
user 0m4.379s
sys 0m5.404s
[3]在資料序列(Data sequence)中隨機找一元素為定界點(Pivot),然後讓序.....
[2]在資料序列(Data sequence)中隨機找一元素為定界點(Pivot),然後讓序.....
[1]在資料序列(Data sequence)中隨機找一元素為定界點(Pivot),然後讓序.....
[ 0 ]在資料序列(Data sequence)中隨機找一元素為定界點(Pivot),然後讓序.....
400000
real 0m1.258s
user 0m1.466s
sys 0m0.496s
其實本來是沒有用到 fmt.Sprintf(),加了這個函數後發現差更多
另外我把前兩天玩的碼也拿測了一下,是 json 的編碼與解碼
package main
import (
"fmt"
"yHash"
)
func main() {
var vecVal1 [5]int = [5]int{1, 2, 3, 4, 5} // array
var vecVal2 []int = []int{1, 2, 3, 4, 5} // slice
hash1 := make(yHash.Hash)
hash1["abc"] = 12345
hash1["def"] = "abcdefghijk"
hash1["vec1"] = vecVal1
hash1["vec2"] = vecVal2
//hash1["subHash"] = make(yHash.Hash)
hash1["subHash"] = yHash.Hash {
"編號1": "9456234534254",
"編號2": 9456234534254,
"編號3": 9456234,
"編號4": 945623,
"單位": "研發",
"專長1": yHash.Hash{
"第一": "吃飯",
"第二": "睡覺",
"第三": "玩電動",
"第四": "看動漫",
},
}
hash1["subHash"].(yHash.Hash)["專長2"] = yHash.Hash{
"S01" : "C++",
"S02" : "PHP",
"S03" : "Java",
"S04" : "Perl",
"S05" : "Golang",
"S06" : "Python",
"S07" : "ShellScript",
"S08" : "JavaScript",
"S09" : "HTML/CSS",
"S10" : "Pascal",
}
fmt.Println(hash1)
fmt.Println(hash1["subHash"].(yHash.Hash)["專長1"].(yHash.Hash)["第一"])
var loopMax int = 100000
var tDatas string
for idx:=0; idx<loopMax; idx++ {
tDatas = hash1.JsonEncode()
}
fmt.Println(tDatas)
fmt.Println("\nEncode OK!\n")
var hash2 yHash.Hash
for idx:=0; idx<loopMax; idx++ {
hash2.JsonDecode(tDatas)
}
fmt.Println("Decode OK!\n")
id21, ok := hash2["subHash"].(map[string] interface{})["編號2"]
var id22 int64
if ok {
id22 = yHash.GetJsonInt(id21)
hash2["subHash"].(map[string] interface{})["編號2"] = id22
}
hash2["subHash"].(map[string] interface{})["編碼"] = 238462.1238478349
fmt.Println(hash1, "\n\n", id21, id22)
fmt.Printf("\n%v\n", hash2)
hash1.Dump()
hash2.Dump()
}
$ time ./ex020-01 && time ./ex020-02
.....
real 0m10.971s
user 0m12.318s
sys 0m3.005s
.....
real 0m8.012s
user 0m9.383s
sys 0m2.916s
跑出來結果 1.5b2 也快了不少!!
---
也許真的有那麼一天
當 golang 與 c++ 執行速度並駕齊驅時.....
^_____________^