成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 后端
這是一個比較小的細節(jié)點,同時也勾起了我的好奇心,因此今天這篇文章就和大家一起研究一下他們兩者有沒有區(qū)別,誰的性能更好一些?建議在此處先自行思考一下,在心里給出自己的答案。

[[385917]]

本文轉(zhuǎn)載自微信公眾號「 腦子進煎魚了」,作者陳煎魚 。轉(zhuǎn)載本文請聯(lián)系 腦子進煎魚了公眾號。

大家好,我是煎魚。

前幾天在微信群看到幾位大佬在討論一個 Go 語言相關(guān)的問題:字符串 len == 0 和 字符串 == "",有啥區(qū)別?“

這是一個比較小的細節(jié)點,同時也勾起了我的好奇心,因此今天這篇文章就和大家一起研究一下他們兩者有沒有區(qū)別,誰的性能更好一些?

建議在此處先自行思考一下,在心里給出自己的答案。

測試方法

在測試的方法中,我們分別聲明了 Test1 和 Test2 方法:

  1. func Test1() bool { 
  2.  var v string 
  3.  if v == "" { 
  4.   return true 
  5.  } 
  6.  return false 
  7.  
  8. func Test2() bool { 
  9.  var v string 
  10.  if len(v) == 0 { 
  11.   return true 
  12.  } 
  13.  return false 

在方法內(nèi)部僅做了簡單的變量類型聲明,分別以 字符串 == "" 和 字符串 len == 0 為判斷依據(jù)。

測試用例

編寫兩個方法的 Benchmark,用于后續(xù)的性能測試:

  1. func BenchmarkTest1(b *testing.B) { 
  2.  for i := 0; i < b.N; i++ { 
  3.   Test1() 
  4.  } 
  5.  
  6. func BenchmarkTest2(b *testing.B) { 
  7.  for i := 0; i < b.N; i++ { 
  8.   Test2() 
  9.  } 

結(jié)果分析

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

從多次測試的結(jié)果來看,兩者比較:

性能幾乎沒有區(qū)別,甚至可以出現(xiàn)一模一樣的情況。

均不涉及內(nèi)存申請和操作,均為 0/op。說明變量并不是聲明了,就有初始化動作的,這塊 Go 編譯器有做優(yōu)化。

結(jié)果上居然是一樣的。根據(jù)曹大的提示,我們可以進一步看一下兩者的匯編代碼,看看具體區(qū)別在哪里:

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

無論是 len(v) == 0,又或是 v == "" 的判斷,其編譯出來的匯編代碼都是完全一致的。可以明確 Go 編譯器在這塊做了明確的優(yōu)化,大概率是直接比對了。

 

因此在 Go 語言中 字符串 len == 0 和 字符串 == "" 的判定,這兩者可以認為是沒有區(qū)別的。

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關(guān)推薦

2021-03-08 08:23:24

Java字符串截取

2021-09-10 08:18:31

Go語言字符串

2009-06-23 14:13:00

Java字符串

2024-04-01 08:41:39

字符串.NET

2014-01-02 16:14:10

PostgreSQL字符串

2009-07-16 17:01:09

Swing字符串

2023-01-11 16:49:13

MySQL數(shù)據(jù)庫

2011-08-10 18:47:18

Cocoa字符串

2010-09-09 11:48:00

SQL函數(shù)字符串

2023-12-15 09:49:54

回溯解決組合問題數(shù)組

2010-11-26 09:51:54

MySQL字符串

2023-12-11 07:33:05

Go語言字符技巧

2023-01-03 08:07:33

Go字符串指針

2010-07-14 16:48:02

Perl字符串比較

2010-06-28 15:18:51

SQL Server

2010-11-26 10:58:30

MySQL字符串

2010-11-26 13:40:58

MySQL空字符串

2010-07-14 16:21:48

Perl

2010-11-26 11:08:20

MySQL字符串

2022-11-10 07:43:45

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: jizz在线免费观看 | 亚洲精品视频在线看 | 久久亚洲国产 | 国产精品日产欧美久久久久 | 天堂一区二区三区四区 | 亚洲视频欧美视频 | 日韩精品在线一区 | 国产精品久久久久久一区二区三区 | 中文字幕亚洲区一区二 | 一区二区三区成人 | 天天操天天插 | 欧美性tv | 福利精品 | 日本成人中文字幕 | а_天堂中文最新版地址 | 国产色99精品9i | 亚洲手机视频在线 | 五月婷婷亚洲 | 91xxx在线观看 | 综合色影院 | 午夜看片网站 | a级毛片免费高清视频 | 久夜精品 | 久久综合九九 | 成人精品视频 | 日本在线看片 | 美女张开腿露出尿口 | 99久久精品免费看国产免费软件 | 三级视频在线观看 | 91资源在线 | 日韩成人精品一区 | 成人精品一区二区三区中文字幕 | 日韩av在线一区 | 亚洲欧美日韩精品久久亚洲区 | 日本久久网 | 九九热免费视频在线观看 | 欧美精品一区二区三区一线天视频 | 国产精品美女久久久 | 亚洲精品一区二区 | 国产精品永久久久久久久www | 久久久久久亚洲精品 |