Size: a a a

2019 December 20

RS

Roman Sharkov in Go-go!
Ан
товарищи, как правильно такое сортировать?
package main

import "fmt"

func main() {
 var X []S
 for i := 0; i < 10; i++ {
   var j S
   j.N = i
   X = append(X, j)
 }
 X = append(X, S{N: 0})

 var M []S
 for _, v := range X {
   for _, r := range M {
     if v.N != r.N {
       M = append(M, v)
     }
   }
 }
 for _, b := range M {
   fmt.Println(b.N)
 }
}

type S struct {
 N int
}
и ещё: не стисняйтесь документировать, что такое X, что такое M 🙂
источник

А

Ан in Go-go!
Roman Sharkov
и ещё: не стисняйтесь документировать, что такое X, что такое M 🙂
Длина заранее не известна, мне же дубли удалить надо, а не просто сортировать. X и M для примера же, в реале там проверка по строкам вообще
источник

RS

Roman Sharkov in Go-go!
Ан
Длина заранее не известна, мне же дубли удалить надо, а не просто сортировать. X и M для примера же, в реале там проверка по строкам вообще
ну как так не известна 🙂

for i := 0; i < 10; i++
источник

А

Ан in Go-go!
Roman Sharkov
ну как так не известна 🙂

for i := 0; i < 10; i++
  var X []S
 for i := 0; i < 10; i++ {
   var j S
   j.N = i
   X = append(X, j)
 }
 X = append(X, S{N: 0}) <===
источник

RS

Roman Sharkov in Go-go!
Ан
  var X []S
 for i := 0; i < 10; i++ {
   var j S
   j.N = i
   X = append(X, j)
 }
 X = append(X, S{N: 0}) <===
ну так длина-же 11 😀
источник

А

Ан in Go-go!
Roman Sharkov
ну так длина-же 11 😀
и?
источник

RS

Roman Sharkov in Go-go!
Ан
и?
она-же известна))
источник

x

x-foby in Go-go!
Ан
Длина заранее не известна, мне же дубли удалить надо, а не просто сортировать. X и M для примера же, в реале там проверка по строкам вообще
Для сортировки можно использовать пакет sort из стандартной библиотеки.
https://play.golang.org/p/VmK16RWkWOn

Удаление дубликатов можно сделать после сортировки, один раз пробежавшись по слайсу
источник

DP

Daniel Podolsky in Go-go!
> 3. когда длина известна заранее лучше не append’ить а присваивать по index’у (это немного эффективнее)

точно? я не намерял разницы
источник

RS

Roman Sharkov in Go-go!
Daniel Podolsky
> 3. когда длина известна заранее лучше не append’ить а присваивать по index’у (это немного эффективнее)

точно? я не намерял разницы
а у меня была разница, но она конечно маленькая
источник

UK

Urry Krivorot in Go-go!
Daniel Podolsky
> 3. когда длина известна заранее лучше не append’ить а присваивать по index’у (это немного эффективнее)

точно? я не намерял разницы
а как мерили? по идее при больших размерах будут затраты на реалокацию. Но ими можно +- пренебречь
источник

x

x-foby in Go-go!
Ан
Длина заранее не известна, мне же дубли удалить надо, а не просто сортировать. X и M для примера же, в реале там проверка по строкам вообще
С удалением дубликатов можно делать как-то так: https://play.golang.org/p/I2ImjbDW3mm
источник

RS

Roman Sharkov in Go-go!
Daniel Podolsky
> 3. когда длина известна заранее лучше не append’ить а присваивать по index’у (это немного эффективнее)

точно? я не намерял разницы
https://play.golang.org/p/ppR6R3tX3Nw

goos: darwin
goarch: amd64
pkg: gotest
BenchmarkAppendDyn-8           480069       2350 ns/op    16376 B/op       11 allocs/op
BenchmarkAppendPrealloc-8     2032125        590 ns/op        0 B/op        0 allocs/op
BenchmarkAssign-8             4739277        253 ns/op        0 B/op        0 allocs/op
PASS
ok   gotest 4.847s
источник

RS

Roman Sharkov in Go-go!
@onokonem странно что при sz = 100 результат обратный:

goos: darwin
goarch: amd64
pkg: gotest
BenchmarkAppendDyn-8          2628472        451 ns/op     2040 B/op        8 allocs/op
BenchmarkAppendPrealloc-8    23950632         49.3 ns/op        0 B/op        0 allocs/op
BenchmarkAssign-8            22158200         54.1 ns/op        0 B/op        0 allocs/op
PASS
ok   gotest 4.280s
источник

RS

Roman Sharkov in Go-go!
@onokonem 501 магическая длина на которой, на моей машине, assign мистически становится быстрее
источник

RS

Roman Sharkov in Go-go!
go version go1.13.5 darwin/amd64
источник

DP

Daniel Podolsky in Go-go!
Urry Krivorot
а как мерили? по идее при больших размерах будут затраты на реалокацию. Но ими можно +- пренебречь
Затрат на релокацию можно и нужно избегать, когда длина известна заранее
источник

UK

Urry Krivorot in Go-go!
Daniel Podolsky
Затрат на релокацию можно и нужно избегать, когда длина известна заранее
та да, я чёт туплю,
при известной длинне надо capacity сразу задавать
а вот вопрос с разницей скорости между append и доступом по индексу становится не тривиальным)
источник

DP

Daniel Podolsky in Go-go!
ну вот я не намерял ничего. хотя append делает ровно то же, что =, + правит len
источник

DP

Daniel Podolsky in Go-go!
Roman Sharkov
@onokonem 501 магическая длина на которой, на моей машине, assign мистически становится быстрее
а до того - на уровне погрешности различия, видимо
источник