問個 Go 問題,字符串 len == 0 和 字符串== "" ,有啥區別?

如有任何問題或建議,歡迎及時交流和碰撞。個人公衆號是 【腦子進煎魚了】,GitHub 地址: https://github.com/eddycjy

你們好,我是煎魚。git

前幾天在微信羣看到幾位大佬在討論一個問題: 」字符串 len == 0 和 字符串 == "" ,有啥區別?「github

這是一個比較小的細節點,同時也勾起了個人好奇心,所以今天這篇文章就和你們一塊兒研究一下他們二者有沒有區別,誰的性能更好一些?微信

測試方法

在測試的方法中,咱們分別聲明瞭 Test1Test2 方法:架構

func Test1() bool {
    var v string
    if v == "" {
        return true
    }
    return false
}

func Test2() bool {
    var v string
    if len(v) == 0 {
        return true
    }
    return false
}

在方法內部僅作了簡單的變量類型聲明,分別以 字符串 == "" 和 字符串 len == 0 爲判斷依據。app

測試用例

編寫兩個方法的 Benchmark,用於後續的性能測試:微服務

func BenchmarkTest1(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Test1()
    }
}

func BenchmarkTest2(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Test2()
    }
}

結果分析

$ go test --bench=. -benchmem
goos: darwin
goarch: amd64
BenchmarkTest1-4       1000000000             0.305 ns/op           0 B/op           0 allocs/op
BenchmarkTest2-4       1000000000             0.305 ns/op           0 B/op           0 allocs/op
PASS
ok      _/Users/eddycjy/go-application/awesomeProject/tests    0.688s

從屢次測試的結果來看,二者比較:性能

  • 性能幾乎沒有區別,甚至能夠出現如出一轍的狀況。
  • 均不涉及內存申請和操做,均爲 0/op。說明變量並非聲明瞭,就有初始化動做的,這塊 Go 編譯器有作優化。

結果上竟然是同樣的。根據曹大的提示,咱們能夠進一步看一下二者的彙編代碼,看看具體區別在哪裏:學習

$ go tool compile -S main.go
"".main STEXT nosplit size=1 args=0x0 locals=0x0
    0x0000 00000 (main.go:3)    TEXT    "".main(SB), NOSPLIT|ABIInternal, $0-0
    0x0000 00000 (main.go:3)    FUNCDATA    $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (main.go:3)    FUNCDATA    $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (main.go:5)    RET
    0x0000 c3                                               .
go.cuinfo.packagename. SDWARFINFO dupok size=0
    0x0000 6d 61 69 6e                                      main
""..inittask SNOPTRDATA size=24
    0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    0x0010 00 00 00 00 00 00 00 00                          ........
gclocals·33cdeccccebe80329f1fdbee7f5874cb SRODATA dupok size=8
    0x0000 01 00 00 00 00 00 00 00

不管是 len(v) == 0,又或是 v == "" 的判斷,其編譯出來的彙編代碼都是徹底一致的。能夠明確 Go 編譯器在這塊作了明確的優化,大機率是直接比對了。測試

你們有沒有其餘的見解和拓展呢,歡迎一塊兒來學習和交流。優化

個人公衆號

分享 Go 語言、微服務架構和奇怪的系統設計,歡迎你們關注個人公衆號和我進行交流和溝通。

最好的關係是互相成就,各位的點贊就是煎魚創做的最大動力,感謝支持。

相關文章
相關標籤/搜索