performance - 代碼順序和性能




go struct (2)

另一個答案解釋了時序差異,讓我們進入結構與切片。

如果編譯器可以在編譯時確定切片足夠大,則訪問切片的元素和結構將生成相同的代碼。 當然,實際上,實際上,編譯器通常不會知道切片的大小,並且將根據您使用的是結構還是切片來應用完全不同的優化,因此要衡量性能,您必須查看整個程序及其行為,而不僅僅是一項特定的操作。

我想找到更快的:結構與數組。 因此,我編寫了一個GO代碼,在該代碼中,我將4個int值(1、2、3和4)寫入一個結構的成員,然後寫入一個長度為4的數組。我試圖找出寫入所需的時間。

案例1:首先,我將值寫入結構,然後寫入數組。 在這裡,我發現數組比結構要快。

package main

import (
    "fmt"
    "time"
)

type abc struct {
    a, b, c, d int
}

func main() {

    var obj abc

    t1 := time.Now()
    obj.a = 1
    obj.b = 2
    obj.c = 3
    obj.d = 4
    t2 := time.Since(t1)

    fmt.Println("Struct access time: : ", t2)

    a := make([]int, 4)
    t3 := time.Now()
    a[0] = 1
    a[1] = 2
    a[2] = 3
    a[3] = 4
    t4 := time.Since(t3)

    fmt.Println("Array access time: : ", t4)

}

情況2:其次,我將值寫入數組,然後寫入結構。 在這裡,我發現結構比數組要快。

package main

import (
    "fmt"
    "time"
)

type abc struct {
    a, b, c, d int
}

func main() {

    var obj abc

    a := make([]int, 4)
    t3 := time.Now()
    a[0] = 1
    a[1] = 2
    a[2] = 3
    a[3] = 4
    t4 := time.Since(t3)

    fmt.Println("Array access time: : ", t4)

    t1 := time.Now()
    obj.a = 1
    obj.b = 2
    obj.c = 3
    obj.d = 4
    t2 := time.Since(t1)

    fmt.Println("Struct access time: : ", t2)

}

為什麼性能取決於我首先寫的內容? 我首先寫的那個似乎慢一些。 為什麼會這樣呢?


首次運行任何代碼都可能會有一些(大量)開銷,例如,可能會加載相關代碼,許多事情可能會推遲到需要它們時才進行(例如內部緩衝區)。 再次運行同一件事可能會花費更少的時間,甚至可能相差 幾個數量級

每當您要測量執行時間時,都應運行多次,測量多次運行的執行時間,併計算平均時間。 出於上述原因,從計算中排除第一個(某些)運行也是一個好主意。

在Go中,最好和最簡單的方法是使用測試文件和基準測試功能。 閱讀 testing 包文檔以獲取更多詳細信息和示例。

您的案例可以像這樣進行基準測試:

package main

import "testing"

type abc struct {
    a, b, c, d int
}

func BenchmarkSlice(b *testing.B) {
    a := make([]int, 4)
    for i := 0; i < b.N; i++ {
        a[0] = 1
        a[1] = 2
        a[2] = 3
        a[3] = 4
    }
}

func BenchmarkStruct(b *testing.B) {
    a := abc{}
    for i := 0; i < b.N; i++ {
        a.a = 1
        a.b = 2
        a.c = 3
        a.d = 4
    }
}

將其保存到諸如 something_test.go 類的文件中,然後使用 go test -bench . 運行它 go test -bench . 。 輸出:

BenchmarkSlice-4        2000000000           1.24 ns/op
BenchmarkStruct-4       2000000000           0.31 ns/op

您可以看到使用結構大約快 4倍 。 如果對基準功能進行重新排序,您將獲得相似(非常接近)的結果。





benchmarking