【Golang】在循環(huán)條件中循環(huán)計(jì)算slice的長(zhǎng)度是否合理

動(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í)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容