如有任何問題或建議,歡迎及時交流和碰撞。個人公衆號是 【腦子進煎魚了】,GitHub 地址: https://github.com/eddycjy。
你們好,我是煎魚。git
前幾天在微信羣看到幾位大佬在討論一個問題: 」字符串 len == 0 和 字符串 == "" ,有啥區別?「github
這是一個比較小的細節點,同時也勾起了個人好奇心,所以今天這篇文章就和你們一塊兒研究一下他們二者有沒有區別,誰的性能更好一些?微信
在測試的方法中,咱們分別聲明瞭 Test1
和 Test2
方法:架構
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
從屢次測試的結果來看,二者比較:性能
結果上竟然是同樣的。根據曹大的提示,咱們能夠進一步看一下二者的彙編代碼,看看具體區別在哪裏:學習
$ 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 語言、微服務架構和奇怪的系統設計,歡迎你們關注個人公衆號和我進行交流和溝通。
最好的關係是互相成就,各位的點贊就是煎魚創做的最大動力,感謝支持。