2 回答

TA貢獻1783條經驗 獲得超4個贊
由于空字符串是字符串的 nil 值,因此您應該與之進行比較。
str == ""
根據它們的 nil 值檢查變量以查看它們是否為空是執(zhí)行此操作的 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: 這些天你唯一能確定某事有多快的事情就是對其進行基準測試?,F(xiàn)代 CPU 是超標量的,因此每條指令一個時鐘周期根本不再正確。與空字符串比較的基準代碼在我的 4GHz 6700k 上以 2.94GHz(2.94*10^9 op/s)運行,每次循環(huán)迭代不到兩個時鐘周期。針對非空字符串的 nil 檢查在同一 CPU 上以 2GHz (2*10^9 op/s) 運行。
這意味著 nil 檢查時每次循環(huán)迭代需要 2 個 CPU 周期,len 檢查時需要 3 個 CPU 周期,或者對空字符串進行檢查時每次循環(huán)迭代一次指令。

TA貢獻1784條經驗 獲得超9個贊
如果您檢查X86 Assembly control flow,您會看到有跳轉等式和跳轉不等式指令。所以理論上,如果你對 Go 編譯器做一些簡單的假設,!=
并且<
會執(zhí)行相同的(1 個 CPU 時鐘)。
如果你真的很喜歡它,你可以看到這個答案并比較為每個人生產的組件。
- 2 回答
- 0 關注
- 266 瀏覽
添加回答
舉報