iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
0
自我挑戰組

Go to 放棄系列 第 17

go note => benchmark

main.go

package main

import (
	"fmt"
	"log"
	"strconv"
)

func print01(num int) string {
	return fmt.Sprintf("%d", num)
}

func print02(num int64) string {
	return strconv.FormatInt(num, 10)
}

func print03(num int) string {
	return strconv.Itoa(num)
}

func main() {
	log.Println(print01(100))
	log.Println(print02(100))
	log.Println(print03(100))

}

main_tets.go

package main

import "testing"

func TestPrint01(t *testing.T) {
	if print01(100) != "100" {
		t.Fatal("error")
	}
}

func TestPrint02(t *testing.T) {
	if print02(int64(100)) != "100" {
		t.Fatal("error")
	}
}

func TestPrint03(t *testing.T) {
	if print03(100) != "100" {
		t.Fatal("error")
	}
}
go test -v

https://ithelp.ithome.com.tw/upload/images/20181101/20112477W3UG90urww.png
在go_test.go加入benchmark func

func BenchmarkPrint01(b *testing.B) { // testing.B => benchmarl
	for i := 0; i < b.N; i++ { // N為很大數字
		print01(100)
	}
}
go test -v -bench=. .

https://ithelp.ithome.com.tw/upload/images/20181101/20112477KOlXGs8CjY.png

其中的BenchmarkPrint01-4 的4代表目前電腦使用幾核心去跑這個benchmark func
ns/op 一個迴圈執行幾Nanosecond

再加入其餘benchmark func來做比較

func BenchmarkPrint02(b *testing.B) { // testing.B => benchmarl
	for i := 0; i < b.N; i++ { // N為很大數字
		print02(int64(100))
	}
}
func BenchmarkPrint03(b *testing.B) { // testing.B => benchmarl
	for i := 0; i < b.N; i++ { // N為很大數字
		print03(100)
	}
}

得到的結果為
https://ithelp.ithome.com.tw/upload/images/20181101/20112477RvxNEnCrIH.png

可以看到第二個func比較快

可以利用vs code去針對Itoa移至定義
可以看到他是包一層FormatInt去做

// Itoa is shorthand for FormatInt(int64(i), 10).
func Itoa(i int) string {
	return FormatInt(int64(i), 10)
}

因為測試func和nechmark是寫在一起
如果只想run benchmark

go test -v -bench=. -run=none .

跑benchmark順便看記憶體分配部分,可以下

go test -v -bench=. -run=none -benchmem .

https://ithelp.ithome.com.tw/upload/images/20181101/20112477lOB2lZ0r7f.png
B/op 一個迴圈佔用幾byte記憶體
1 allocs/op 代表每次執行都需要搭配一個記憶體空間

ex: 8B/op 2 allocs/op
代表每次執行都需要搭配2個記憶體空間,而一個記憶體空間為 8 Bytes。


上一篇
go note => test part2
下一篇
go note => check code quality
系列文
Go to 放棄30

尚未有邦友留言

立即登入留言