自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[385917]]

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

大家好,我是煎魚。

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

這是一個(gè)比較小的細(xì)節(jié)點(diǎn),同時(shí)也勾起了我的好奇心,因此今天這篇文章就和大家一起研究一下他們兩者有沒有區(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ù)。

測試用例

編寫兩個(gè)方法的 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。說明變量并不是聲明了,就有初始化動(dòng)作的,這塊 Go 編譯器有做優(yōu)化。

結(jié)果上居然是一樣的。根據(jù)曹大的提示,我們可以進(jìn)一步看一下兩者的匯編代碼,看看具體區(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 和 字符串 == "" 的判定,這兩者可以認(rèn)為是沒有區(qū)別的。

 

責(zé)任編輯:武曉燕 來源: 腦子進(jìn)煎魚了
相關(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

2010-09-09 11:48:00

SQL函數(shù)字符串

2014-01-02 16:14:10

PostgreSQL字符串

2023-01-11 16:49:13

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

2009-07-16 17:01:09

Swing字符串

2011-08-10 18:47:18

Cocoa字符串

2010-11-26 09:51:54

MySQL字符串

2023-12-15 09:49:54

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

2023-12-11 07:33:05

Go語言字符技巧

2023-01-03 08:07:33

Go字符串指針

2010-06-28 15:18:51

SQL Server

2010-07-14 16:48:02

Perl字符串比較

2010-11-26 10:58:30

MySQL字符串

2010-11-26 13:40:58

MySQL空字符串

2010-07-14 16:21:48

Perl

2022-11-10 07:43:45

2010-07-14 12:39:30

Prel字符串
點(diǎn)贊
收藏

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