2016-01-17 27 views
-4
type path []byte 

func (p path) ToUpper() { 
    for i, b := range p { 
     if 'a' <= b && b <= 'z' { 
      p[i] = b + 'A' - 'a' 
     } 
    } 
} 

(本實施例中是由「圍棋博客」複製),如果ToUpper的變化是這樣的:Golang:哪個方向是有關使用更高效「爲範圍」在上述

func (p path) ToUpper() { 
    for i, _ := range p { 
     if 'a' <= p[i] && p[i] <= 'z' { 
      p[i] = p[i] + 'A' - 'a' 
     } 
    } 
} 

這將更高效

爲什麼?

「The Blog Blog」與前者說: 「ToUpper方法在for範圍構造中使用兩個變量來捕獲索引和切片元素,這種形式的循環避免了多次寫入p [i]身體。」

是什麼意思?

回答

0

前者具有多個存儲器操作,即上b:它是在循環的第一次運行分配和在除了每個隨後的運行重新分配給i原始片被修改,而在第二個例子中,只有i被分配並重新分配並用於對原始片進行修改。

+2

但前者也有較少的邊界檢查,並且b可能永遠不會留下一個寄存器。如果沒有基準測試和/或檢查生成的組件,您不能做出任何假設。 – JimB

+0

@JimB:感謝您的參與 - 再次,分裂「假設」的含義成真。既然你很友善,不會投票給我,如果可能的話,我會自己做出悔改的行爲。 –

+2

僅供參考,前者在我的機器上以go1.6顯着更快 – JimB