亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

性能:排序切片與排序類型(切片)與排序實現

性能:排序切片與排序類型(切片)與排序實現

Go
小怪獸愛吃肉 2023-06-01 17:14:29
我正在處理一些代碼挑戰,發現自定義排序(排序接口的實現)比僅針對切片的原始結構工作得更快。這是為什么?切片轉換為類型是否有一些魔力(比如轉換為結構指針的切片)?我做了一些代碼來測試我的 hipotesispackage sortingexampleimport (    "sort"    "testing")// Example of struct we going to sort.type Point struct {    X, Y int}// --- Struct / Raw Datavar TestCases = []Point{    {10, 3},    {10, 4},    {10, 35},    {10, 5},    {10, 51},    {10, 25},    {10, 59},    {10, 15},    {10, 22},    {10, 91},}// Example One - Sorting Slice Directly// somehow - slowest way to sort it.func SortSlice(points []Point) {    sort.Slice(points, func(i, j int) bool {        return points[i].Y < points[j].Y    })}func BenchmarkSlice(b *testing.B) {    tmp := make([]Point, len(TestCases))    for i := 0; i < b.N; i++ {        copy(tmp, TestCases)        SortSlice(tmp)    }}// Example Two - Sorting Slice Directly// much faster performancetype Points []Point// Sort interface implementationfunc (p Points) Less(i, j int) bool { return p[i].Y < p[j].Y }func (p Points) Len() int           { return len(p) }func (p Points) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }func SortStruct(points []Point) {    sort.Sort(Points(points))}func BenchmarkStruct(b *testing.B) {    tmp := make([]Point, len(TestCases))    for i := 0; i < b.N; i++ {        copy(tmp, TestCases)        SortStruct(tmp)    }}// --- Pointersvar TestCasesPoints = []*Point{    &Point{10, 3},    &Point{10, 4},    &Point{10, 35},    &Point{10, 5},    &Point{10, 51},    &Point{10, 25},    &Point{10, 59},    &Point{10, 15},    &Point{10, 22},    &Point{10, 91},}// Example Three - Sorting Slice of Pointersfunc SortSlicePointers(points []*Point) {    sort.Slice(points, func(i, j int) bool {        return points[i].Y < points[j].Y    })}func BenchmarkSlicePointers(b *testing.B) {    tmp := make([]*Point, len(TestCasesPoints))    for i := 0; i < b.N; i++ {        copy(tmp, TestCasesPoints)        SortSlicePointers(tmp)    }}很明顯,對指針切片進行排序會更快,但是為什么自定義排序實現會更快呢?有什么我可以閱讀的資源嗎?
查看完整描述

2 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

一般sort.Slice()sort.SliceStable()功能適用于任何切片。您必須將切片值作為interface{}值傳遞,并且實現必須使用反射(reflect包)來訪問其元素和長度,并執行元素交換。

相反,當你sort.Interface自己實現類型時,在你的實現中你可以訪問你的切片的靜態類型,并且你可以提供沒有sort.Interface反射的實現,這將使它更快。

因此,如果性能很關鍵/很重要,請始終sort.Interface自己提供實現。如果切片很小或性能不重要,您可以使用更方便的sort.Slice()功能。


查看完整回答
反對 回復 2023-06-01
?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

添加帶有分配的運行輸出看起來接口/結構方法也更好。


? go version

go version go1.17.1 darwin/amd64

? go test -bench=. -benchmem

goos: darwin

goarch: amd64

pkg: github.com/timescale/promscale/pkg/api/parser/json/test

cpu: Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz

BenchmarkSlice-12                        3533616               319.6 ns/op            88 B/op          3 allocs/op

BenchmarkStruct-12                       9157018               126.0 ns/op            24 B/op          1 allocs/op

BenchmarkSlicePointers-12                6643446               167.1 ns/op            56 B/op          2 allocs/op

BenchmarkStructOfSlicePointers-12        9004021               124.1 ns/op            24 B/op          1 allocs/op

PASS

ok      github.com/timescale/promscale/pkg/api/parser/json/test 5.425s


查看完整回答
反對 回復 2023-06-01
  • 2 回答
  • 0 關注
  • 202 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號