Help us understand the problem. What is going on with this article?

Go言語でのString・Int間の変換速度について

More than 3 years have passed since last update.

※ 追記 reflectの使い方が間違っていたので訂正しました。切腹...m(__)m

いくつか書き方があるようなので、簡単な比較をしてみました。

ベンチに使ったコードは下記にあります

https://gist.github.com/evalphobia/caee1602969a640a4530

文字列から数値(String to Int)

文字列から数値に変換する方法

strconv.Atoi(string) int, error

// 引数は 変換対称の文字列, 基数, ビット数
strconv.ParseInt(string, int, int) int64, error

ベンチマーク結果

// 小さな数値文字列で計測 (n = 35)
BenchmarkAtoi                   50000000           28.6 ns/op         0 B/op           0 allocs/op
BenchmarkAtoiParseInt           50000000           27.0 ns/op         0 B/op           0 allocs/op

// とても大きな数値文字列で計測 (n = 999,999,999,999)
BenchmarkAtoiBig                20000000           57.2 ns/op         0 B/op           0 allocs/op
BenchmarkAtoiParseIntBig        30000000           54.6 ns/op         0 B/op           0 allocs/op

結論

どちらもそこまで変わらないので、10進数であれば簡単な strconv.Atoi(string) を使う感じでしょうか?

  • 戻り値の型がint で欲しい場合は strconv.Atoi(string)
  • 戻り値の型がint64 で欲しい場合は strconv.ParseInt(string, 10, 64)

を使えば良さそう。

数値から文字列(Int to String)

数値から文字列に変換する方法

strconv.Itoa(int) string

// 引数は 変換対称の数値, 基数
strconv.FormatInt(int64, int) string

fmt.Sprint(int) string
fmt.Sprintf("%d", int) string

ベンチマーク結果

// 小さな数値で計測 (n = 35)
BenchmarkItoa                           30000000           52.6 ns/op         2 B/op           1 allocs/op
BenchmarkItoaFormatInt                  30000000           52.5 ns/op         2 B/op           1 allocs/op
BenchmarkItoaSprint                     5000000            254 ns/op          16 B/op          2 allocs/op
BenchmarkItoaSprintf                    5000000            299 ns/op          16 B/op          2 allocs/op

// とても大きな数値で計測 (n = 999,999,999,999)
BenchmarkItoaBig                        10000000           140 ns/op          16 B/op          1 allocs/op
BenchmarkItoaFormatIntBig               10000000           118 ns/op          16 B/op          1 allocs/op
BenchmarkItoaSprintBig                  5000000            326 ns/op          24 B/op          2 allocs/op
BenchmarkItoaSprintfBig                 5000000            363 ns/op          24 B/op          2 allocs/op

結論

  • 型がわかっている場合は strconv.Itoa(int)strconv.FormatInt(int64, 10)
  • fmt.Sprint() は型が分からないときに使うと良さそう

といった感じなんでしょうか。

eure
オンラインデーティングサービス「Pairs」の運営・開発をしている企業。様々なモダンな技術を駆使してビジネスを成長させています。
https://eure.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした