我正在尝试构建一个验证给定输入的函数。输入是一个整数值。我的问题是,哪种方法应该是最有效和最高效的
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)
亲切的问候
这是一个基准测试,修复了循环方法为输入 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 倍(一旦固定以正确处理极端情况)
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |