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

时间:2016-01-17 11:28:44

标签: go comparison-operators

Go中,要检查字符串是否为空,可以使用:

len(str) == 0

len(str) < 1

str == ""

基本上只需要选择一个运算符==<!=,但就性能而言,希望选项更好吗?

我的猜测是==只是比较并且不会迭代<<==之类的值,因此想知道什么是最好的做法

2 个答案:

答案 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) == 0len(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并比较为每个组件生成的程序集。