新聞中心
本文轉(zhuǎn)載自微信公眾號(hào)「 腦子進(jìn)煎魚了」,作者陳煎魚 。轉(zhuǎn)載本文請(qǐng)聯(lián)系 腦子進(jìn)煎魚了公眾號(hào)。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括泗陽(yáng)網(wǎng)站建設(shè)、泗陽(yáng)網(wǎng)站制作、泗陽(yáng)網(wǎng)頁(yè)制作以及泗陽(yáng)網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,泗陽(yáng)網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到泗陽(yáng)省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
大家好,我是煎魚。
前幾天在微信群看到幾位大佬在討論一個(gè) Go 語(yǔ)言相關(guān)的問(wèn)題:字符串 len == 0 和 字符串 == "",有啥區(qū)別?“
這是一個(gè)比較小的細(xì)節(jié)點(diǎn),同時(shí)也勾起了我的好奇心,因此今天這篇文章就和大家一起研究一下他們兩者有沒(méi)有區(qū)別,誰(shuí)的性能更好一些?
建議在此處先自行思考一下,在心里給出自己的答案。
測(cè)試方法
在測(cè)試的方法中,我們分別聲明了 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
- }
在方法內(nèi)部?jī)H做了簡(jiǎn)單的變量類型聲明,分別以 字符串 == "" 和 字符串 len == 0 為判斷依據(jù)。
測(cè)試用例
編寫兩個(gè)方法的 Benchmark,用于后續(xù)的性能測(cè)試:
- 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()
- }
- }
結(jié)果分析
- $ 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
從多次測(cè)試的結(jié)果來(lái)看,兩者比較:
性能幾乎沒(méi)有區(qū)別,甚至可以出現(xiàn)一模一樣的情況。
均不涉及內(nèi)存申請(qǐng)和操作,均為 0/op。說(shuō)明變量并不是聲明了,就有初始化動(dòng)作的,這塊 Go 編譯器有做優(yōu)化。
結(jié)果上居然是一樣的。根據(jù)曹大的提示,我們可以進(jìn)一步看一下兩者的匯編代碼,看看具體區(qū)別在哪里:
- $ 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
無(wú)論是 len(v) == 0,又或是 v == "" 的判斷,其編譯出來(lái)的匯編代碼都是完全一致的??梢悦鞔_ Go 編譯器在這塊做了明確的優(yōu)化,大概率是直接比對(duì)了。
因此在 Go 語(yǔ)言中 字符串 len == 0 和 字符串 == "" 的判定,這兩者可以認(rèn)為是沒(méi)有區(qū)別的。
分享名稱:?jiǎn)杺€(gè)Go問(wèn)題,字符串len==0和字符串=="",有啥區(qū)別?
URL地址:http://m.5511xx.com/article/cddhhdi.html


咨詢
建站咨詢
