動(dòng)機(jī):經(jīng)常在開源項(xiàng)目中看到,for循環(huán)中重復(fù)計(jì)算一個(gè)表達(dá)式,而這個(gè)表達(dá)式的值是固定的,這樣做是不是會(huì)影響性能。抽時(shí)間做了一個(gè)基準(zhǔn)測(cè)試,測(cè)試很簡(jiǎn)單,但是解除了我內(nèi)心的困惑。有相同強(qiáng)迫癥的同學(xué),可以參考,可以提意見。
下面是基準(zhǔn)測(cè)試代碼:
package test
import "testing"
func BenchmarkAssign(t *testing.B) {
s := make([]int, 10000)
t.ResetTimer()
for i := 0; i < t.N; i++ {
length := len(s)
for j := 0; j < length; j++ {
}
}
}
func BenchmarkCalculate(t *testing.B) {
s := make([]int, 10000)
t.ResetTimer()
for i := 0; i < t.N; i++ {
for j := 0; j < len(s); j++ {
}
}
}
func BenchmarkAssignIf(t *testing.B) {
s := make([]int, 9999)
t.ResetTimer()
for i := 0; i < t.N; i++ {
length := len(s)
if length < 10000 {
var _ = length
}
}
}
func BenchmarkCalculateIf(t *testing.B) {
s := make([]int, 9999)
t.ResetTimer()
for i := 0; i < t.N; i++ {
if len(s) < 10000 {
var _ = len(s)
}
}
}
測(cè)試結(jié)果:

基準(zhǔn)測(cè)試
發(fā)現(xiàn)不管是在循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu),把計(jì)算結(jié)果儲(chǔ)存起來還是重復(fù)計(jì)算這個(gè)表達(dá)式,對(duì)測(cè)試結(jié)果并沒有影響。
-benchmem參數(shù)會(huì)每次操作會(huì)參數(shù)多少次內(nèi)存分配(allocs/op)和每次分配消耗多少byte(B/op);但是它只會(huì)統(tǒng)計(jì)堆里面的內(nèi)存分配情況。
對(duì)結(jié)果的猜測(cè),slice的長(zhǎng)度字段,是slice的一個(gè)屬性,容量應(yīng)該也是相同情況,計(jì)算一個(gè)slice長(zhǎng)度就等于取slice得這個(gè)字段一樣,那么和訪問一個(gè)變量在效率也就沒有什么區(qū)別了。這里的計(jì)算,應(yīng)該不是我想象的那么通過一個(gè)算法進(jìn)行統(tǒng)計(jì)。如果有不同意見歡迎討論學(xué)習(xí)。