len(字符串) == 0 或 len(字符串) < 1
len(string) == 0 or len(string) < 1
在 Go 中,要检查字符串是否为空,可以使用:
len(str) == 0
或
len(str) < 1
或
str == ""
基本上只是选择运算符的一个指标==
、<
、!=
,但在性能方面希望选项更好?
我的猜测是 ==
只是比较而不是像 <
那样遍历值,或者 <==
可以这样做,因此想知道什么是最好的方法实践.
由于空字符串是字符串的 nil 值,您应该与它进行比较。
str == ""
根据它们的 nil 值检查变量以查看它们是否为空是执行此操作的 Go 方法。
就性能而言,没有显着差异。使用 len(str)
是一个函数调用,所以理论上它应该更慢。
编辑:一些证据:
我对这段代码进行了基准测试:
func BenchmarkNil(b *testing.B) {
str := "asd"
cnt := 0
for i := 0; i < b.N; i++ {
if str == "" {
cnt++
}
}
}
使用 if-statement 中的三种不同检查:str == ""
、len(str) == 0
和 len(str) < 1
。
BenchmarkLenEq-8 2000000000 0.77 ns/op
BenchmarkLenLess-8 2000000000 0.76 ns/op
BenchmarkNil-8 2000000000 0.50 ns/op
对于空字符串检查(str := ""
而不是 str := "asd"
),没有可测量的差异。检查 non-empty 字符串需要更多时间,而 nil 检查速度明显更快。
BenchmarkLenEq-8 2000000000 0.34 ns/op
BenchmarkLenLess-8 2000000000 0.33 ns/op
BenchmarkNil-8 2000000000 0.33 ns/op
编辑2:
这些天你唯一能做的就是对它进行基准测试来确定它有多快。现代 CPU 是超标量的,因此每条指令一个时钟周期不再适用。基准代码与我的 4GHz 6700k 上 2.94GHz (2.94*10^9 op/s) 的空字符串 运行 进行比较,每次循环迭代少于两个时钟周期。在同一个 CPU 上以 2GHz (2*10^9 op/s) 对 non-empty 字符串 运行 进行 nil 检查。
这意味着在 nil 检查时每个循环迭代 2 cpu 个周期,在 len 检查时 3 个周期,或者在检查空字符串时每个循环迭代一个指令。
如果你检查X86 Assembly control flows,你会看到有相等跳转和不等式跳转指令。所以理论上,如果你对 Go 编译器做出一些简单的假设,!=
和 <
将执行相同的操作(1 CPU 时钟)。
如果你真的喜欢它,你可以看看 this answer 并比较它们各自生成的程序集。
在 Go 中,要检查字符串是否为空,可以使用:
len(str) == 0
或
len(str) < 1
或
str == ""
基本上只是选择运算符的一个指标==
、<
、!=
,但在性能方面希望选项更好?
我的猜测是 ==
只是比较而不是像 <
那样遍历值,或者 <==
可以这样做,因此想知道什么是最好的方法实践.
由于空字符串是字符串的 nil 值,您应该与它进行比较。
str == ""
根据它们的 nil 值检查变量以查看它们是否为空是执行此操作的 Go 方法。
就性能而言,没有显着差异。使用 len(str)
是一个函数调用,所以理论上它应该更慢。
编辑:一些证据:
我对这段代码进行了基准测试:
func BenchmarkNil(b *testing.B) {
str := "asd"
cnt := 0
for i := 0; i < b.N; i++ {
if str == "" {
cnt++
}
}
}
使用 if-statement 中的三种不同检查:str == ""
、len(str) == 0
和 len(str) < 1
。
BenchmarkLenEq-8 2000000000 0.77 ns/op
BenchmarkLenLess-8 2000000000 0.76 ns/op
BenchmarkNil-8 2000000000 0.50 ns/op
对于空字符串检查(str := ""
而不是 str := "asd"
),没有可测量的差异。检查 non-empty 字符串需要更多时间,而 nil 检查速度明显更快。
BenchmarkLenEq-8 2000000000 0.34 ns/op
BenchmarkLenLess-8 2000000000 0.33 ns/op
BenchmarkNil-8 2000000000 0.33 ns/op
编辑2: 这些天你唯一能做的就是对它进行基准测试来确定它有多快。现代 CPU 是超标量的,因此每条指令一个时钟周期不再适用。基准代码与我的 4GHz 6700k 上 2.94GHz (2.94*10^9 op/s) 的空字符串 运行 进行比较,每次循环迭代少于两个时钟周期。在同一个 CPU 上以 2GHz (2*10^9 op/s) 对 non-empty 字符串 运行 进行 nil 检查。
这意味着在 nil 检查时每个循环迭代 2 cpu 个周期,在 len 检查时 3 个周期,或者在检查空字符串时每个循环迭代一个指令。
如果你检查X86 Assembly control flows,你会看到有相等跳转和不等式跳转指令。所以理论上,如果你对 Go 编译器做出一些简单的假设,!=
和 <
将执行相同的操作(1 CPU 时钟)。
如果你真的喜欢它,你可以看看 this answer 并比较它们各自生成的程序集。