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

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

len(str) == 0

或者

len(str) < 1

或者

str == ""

基本上只是一个选择的运营商的计==<!=,但在性能上的愿望选择方面比较好?

我的猜测是,==只是比较而不是遍历值,<或者两者<==都可以做,因此想知道什么是最好的方法实践。


慕妹3146593
浏览 213回答 2
2回答

慕娘9325324

由于空字符串是字符串的 nil 值,因此您应该与之进行比较。str == ""根据它们的 nil 值检查变量以查看它们是否为空是执行此操作的 Go 方式。在性能方面,没有显着差异。Usinglen(str)是一个函数调用,所以理论上它应该更慢。编辑:一些证据:我对这段代码进行了基准测试:func BenchmarkNil(b *testing.B) {&nbsp; &nbsp; str := "asd"&nbsp; &nbsp; cnt := 0&nbsp; &nbsp; for i := 0; i < b.N; i++ {&nbsp; &nbsp; &nbsp; &nbsp; if str == "" {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cnt++&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}使用 if 语句中的三个不同检查:str == "",len(str) == 0和len(str) < 1。BenchmarkLenEq-8&nbsp; &nbsp; &nbsp; &nbsp; 2000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.77 ns/opBenchmarkLenLess-8&nbsp; &nbsp; &nbsp; 2000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.76 ns/opBenchmarkNil-8&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.50 ns/op对于检查空字符串(str := ""而不是str := "asd"),没有可测量的差异。检查非空字符串需要更多时间,并且在那里,nil 检查明显更快。BenchmarkLenEq-8&nbsp; &nbsp; &nbsp; &nbsp; 2000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.34 ns/opBenchmarkLenLess-8&nbsp; &nbsp; &nbsp; 2000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.33 ns/opBenchmarkNil-8&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.33 ns/opEDIT2: 这些天你唯一能确定某事有多快的事情就是对其进行基准测试。现代 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 周期,或者对空字符串进行检查时每次循环迭代一次指令。

千万里不及你

如果您检查X86 Assembly control flow,您会看到有跳转等式和跳转不等式指令。所以理论上,如果你对 Go 编译器做一些简单的假设,!=并且<会执行相同的(1 个 CPU 时钟)。如果你真的很喜欢它,你可以看到这个答案并比较为每个人生产的组件。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go