在Go中,要检查字符串是否为空,可以使用:
len(str) == 0
或
len(str) < 1
或
str == ""
基本上只需要选择一个运算符==
,<
,!=
,但就性能而言,希望选项更好吗?
我的猜测是==
只是比较并且不会迭代<
或<==
之类的值,因此想知道什么是最好的做法
答案 0 :(得分:6)
由于空字符串是字符串的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语句中使用三个不同的检查: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"
),没有可衡量的差异。检查非空字符串需要更多时间,并且在那里,nil检查明显更快。
BenchmarkLenEq-8 2000000000 0.34 ns/op
BenchmarkLenLess-8 2000000000 0.33 ns/op
BenchmarkNil-8 2000000000 0.33 ns/op
<强> EDIT2:强> 这些天你唯一可以做的就是确定一些东西的速度是基准。现代CPU是超标量的,因此每条指令一个时钟周期就不再适用。与空字符串进行比较的基准代码在我的4GHz 6700k上以2.94GHz(2.94 * 10 ^ 9 op / s)运行,每次循环迭代少于两个时钟周期。针对非空字符串的nil检查在同一CPU上以2GHz(2 * 10 ^ 9 op / s)运行。
这意味着在nil检查上每循环迭代2个cpu周期,在len检查上为3个cpu循环,或者在对空字符串进行检查时每循环迭代一个指令。
答案 1 :(得分:0)
如果你检查X86 Assembly control flows,你就会发现平等跳跃并跳过不等式指令。所以从理论上讲,如果你对Go编译器做一些简单的假设,!=
和<
将执行相同的(1个CPU时钟)。
如果你真的喜欢它,你可以看到this answer并比较为每个组件生成的程序集。