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
在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=. .
其中的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)
}
}
得到的結果為
可以看到第二個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 .
B/op 一個迴圈佔用幾byte記憶體
1 allocs/op 代表每次執行都需要搭配一個記憶體空間
ex: 8B/op 2 allocs/op
代表每次執行都需要搭配2個記憶體空間,而一個記憶體空間為 8 Bytes。