Skip to content

Commit b2f18d8

Browse files
committed
sliceop: improve performances of Take
name old time/op new time/op delta Take/Len=2-8 2.95ns ± 2% 2.96ns ± 2% ~ (p=0.952 n=20+20) Take/Len=4-8 3.43ns ± 1% 3.67ns ± 1% +6.96% (p=0.000 n=20+19) Take/Len=8-8 3.92ns ± 2% 4.17ns ± 1% +6.31% (p=0.000 n=19+20) Take/Len=128-8 36.4ns ± 2% 35.6ns ± 2% -2.21% (p=0.000 n=20+20) Take/Len=1024-8 278ns ± 5% 271ns ± 2% -2.29% (p=0.001 n=17+19) Take/Len=1048576-8 1.27ms ± 2% 0.67ms ± 6% -46.97% (p=0.000 n=19+20) name old alloc/op new alloc/op delta Take/Len=2-8 0.00B 0.00B ~ (all equal) Take/Len=4-8 0.00B 0.00B ~ (all equal) Take/Len=8-8 0.00B 0.00B ~ (all equal) Take/Len=128-8 0.00B 0.00B ~ (all equal) Take/Len=1024-8 0.00B 0.00B ~ (all equal) Take/Len=1048576-8 0.00B 0.00B ~ (all equal) name old allocs/op new allocs/op delta Take/Len=2-8 0.00 0.00 ~ (all equal) Take/Len=4-8 0.00 0.00 ~ (all equal) Take/Len=8-8 0.00 0.00 ~ (all equal) Take/Len=128-8 0.00 0.00 ~ (all equal) Take/Len=1024-8 0.00 0.00 ~ (all equal) Take/Len=1048576-8 0.00 0.00 ~ (all equal)
1 parent 2b4b393 commit b2f18d8

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

sliceop/sliceop.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,11 @@ func Take[T any](dst, src []T, indices []int) []T {
101101
}
102102

103103
dst[0] = src[indices[0]]
104-
for i := 1; i < len(indices); i++ {
105-
v0 := indices[i-1]
104+
var (
105+
v0 = indices[0]
106+
nn = len(indices)
107+
)
108+
for i := 1; i < nn; i++ {
106109
v1 := indices[i]
107110
switch {
108111
case v0 < v1:
@@ -112,8 +115,10 @@ func Take[T any](dst, src []T, indices []int) []T {
112115
case v0 > v1:
113116
panic(errSortedIndices)
114117
}
115-
dst[i] = src[v1]
118+
dst[i-1] = src[v0]
119+
v0 = v1
116120
}
121+
dst[nn-1] = src[v0]
117122

118123
return dst
119124
}

0 commit comments

Comments
 (0)