Go: string转换int类型性能对比

1,458 阅读2分钟

三种方式

性能最佳

bitSize参数不会将字符串转换为您选择的类型, 而只是在此处将结果限制为特定的“位”

func ParseInt(s string, base int, bitSize int) (i int64, err error)
package main

import (
	"fmt"
	"strconv"
)

func main() {
	i, err := strconv.ParseInt("123", 10, 64)
	if err != nil {
		panic(err)
	}
	fmt.Println(i)
}

如果需要int32,按照以下方式进行转换(bitSize设置为32后再使用int32进行强制转换),避免数据丢失。

s := "2147483647" // biggest int32
i64, err := strconv.ParseInt(s, 10, 32)
...
i := int32(i64)

灵活输出

fmt.Scanf()

内部使用的是Fscanf

func Sscanf(str string, format string, a ...interface{}) (n int, err error)
package main

import (
	"fmt"
)

func main() {
	s := "123"

	var i int
	if _, err := fmt.Sscanf(s, "%d", &i); err == nil {
		fmt.Println(i)
	}
}

性能居中

strconv.Atoi(string)

此种方式等价于ParseInt(s, 10, 0),之后在使用int强制转换

func Atoi(s string) (int, error)
package main

import (
	"fmt"
	"strconv"
)

func main() {
	i, err := strconv.Atoi("123")
	if err != nil {
		panic(err)
	}
	fmt.Println(i)
}

Benchmark 测试

package main

import (
	"fmt"
	"strconv"
	"testing"
)

var (
	num    = 987654321
	numstr = "987654321"
)

// strconv.ParseInt
func BenchmarkStrconvParseInt(b *testing.B) {
	num64 := int64(num)
	for i := 0; i < b.N; i++ {
		x, err := strconv.ParseInt(numstr, 10, 64)
		if x != num64 || err != nil {
			b.Error(err)
		}
	}
}

// strconv.Atoi
func BenchmarkStrconvAtoi(b *testing.B) {
	for i := 0; i < b.N; i++ {
		x, err := strconv.Atoi(numstr)
		if x != num || err != nil {
			b.Error(err)
		}
	}
}

// fmt.Sscan
func BenchmarkFmtSscan(b *testing.B) {
	for i := 0; i < b.N; i++ {
		var x int
		n, err := fmt.Sscanf(numstr, "%d", &x)
		if n != 1 || x != num || err != nil {
			b.Error(err)
		}
	}
}

go test -bench=. strconv_int_test.go

测试机结果

台式机测试结果

goos: linux
goarch: amd64
BenchmarkStrconvParseInt-12     55742625                21.1 ns/op
BenchmarkStrconvAtoi-12         136184725                8.66 ns/op
BenchmarkFmtSscan-12             2034818               596 ns/op
PASS
ok      command-line-arguments  5.081s

Mac笔记本测试结果

goos: darwin
goarch: amd64
BenchmarkStrconvParseInt-4      30791514                36.4 ns/op
BenchmarkStrconvAtoi-4          97751853                12.3 ns/op
BenchmarkFmtSscan-4              1555105               782 ns/op
PASS
ok      command-line-arguments  6.188s