为了账号安全,请及时绑定邮箱和手机立即绑定

len(string) == 0 或 len(string) < 1

len(string) == 0 或 len(string) < 1

Go
慕妹3146593 2021-12-07 10:48:14
在Go 中,要检查字符串是否为空,可以使用:len(str) == 0或者len(str) < 1或者str == ""基本上只是一个选择的运营商的计==,<,!=,但在性能上的愿望选择方面比较好?我的猜测是,==只是比较而不是遍历值,<或者两者<==都可以做,因此想知道什么是最好的方法实践。
查看完整描述

2 回答

?
慕娘9325324

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 周期,或者对空字符串进行检查时每次循环迭代一次指令。


查看完整回答
反对 回复 2021-12-07
?
千万里不及你

TA贡献1784条经验 获得超9个赞

如果您检查X86 Assembly control flow,您会看到有跳转等式和跳转不等式指令。所以理论上,如果你对 Go 编译器做一些简单的假设,!=并且<会执行相同的(1 个 CPU 时钟)。

如果你真的很喜欢它,你可以看到这个答案并比较为每个人生产的组件。


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信