查找整数位数的最快方法?

Alp*_*hta 0 go

我正在尝试构建一个验证给定输入的函数。输入是一个整数值。我的问题是,哪种方法应该是最有效和最高效的

count := 0

for number != 0 {
  number /= 10
  count += 1
}

return count
Run Code Online (Sandbox Code Playgroud)

或者

len(strconv.Itoa(intValue))
Run Code Online (Sandbox Code Playgroud)

亲切的问候

Eli*_*sky 7

这是一个基准测试,修复了循环方法为输入 0 返回 1:

func lenLoop(i int) int {
    if i == 0 {
        return 1
    }
    count := 0
    for i != 0 {
        i /= 10
        count++
    }
    return count
}

func lenItoa(i int) int {
    return len(strconv.Itoa(i))
}


const num = 834589

func BenchmarkLoop(b *testing.B) {
    for i := 0; i < b.N; i++ {
        lenLoop(num)
    }
}

func BenchmarkItoa(b *testing.B) {
    for i := 0; i < b.N; i++ {
        lenItoa(num)
    }
}
Run Code Online (Sandbox Code Playgroud)

[请注意,这些仅适用于正数]

我机器上的输出:

goos: linux
goarch: amd64
cpu: Intel(R) Core(TM) i7-4771 CPU @ 3.50GHz
BenchmarkLoop
BenchmarkLoop-8     213208418            5.535 ns/op
BenchmarkItoa
BenchmarkItoa-8     33039769            33.74 ns/op
Run Code Online (Sandbox Code Playgroud)

请注意,对于不同大小的输入数字,您可能会得到不同的结果;我选择长度 6 作为典型,但您可以尝试其他选项。对于较短的数字,额外的机制Itoa使其比循环更慢(相对而言)。对于巨大的数字,它“仅”比循环慢 4 倍。


log10另一个答案中提出的方法比循环慢 2 倍(一旦固定以正确处理极端情况)