2 回答
TA贡献1783条经验 获得超4个赞
由于空字符串是字符串的 nil 值,因此您应该与之进行比较。
str == ""
根据它们的 nil 值检查变量以查看它们是否为空是执行此操作的 Go 方式。
在性能方面,没有显着差异。Usinglen(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 周期,或者对空字符串进行检查时每次循环迭代一次指令。
TA贡献1784条经验 获得超9个赞
如果您检查X86 Assembly control flow,您会看到有跳转等式和跳转不等式指令。所以理论上,如果你对 Go 编译器做一些简单的假设,!=
并且<
会执行相同的(1 个 CPU 时钟)。
如果你真的很喜欢它,你可以看到这个答案并比较为每个人生产的组件。
- 2 回答
- 0 关注
- 212 浏览
添加回答
举报