作者 主題: [Golang] go 1.4.2 vs 1.5b2 performance ^___^  (閱讀 4328 次)

0 會員 與 1 訪客 正在閱讀本文。

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
[Golang] go 1.4.2 vs 1.5b2 performance ^___^
« 於: 2015-07-24 14:01 »
因為剛好看到 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++ 執行速度並駕齊驅時.....
^_____________^