Pull to refresh
0
0
Send message

На M1 у новой map наблюдаются проблемы в многопоточном режиме доступа

package main

import (
	"sync"
	"testing"
)

func BenchmarkMap(b *testing.B) {
	b.Run("map", func(b *testing.B) {
		var (
			wg sync.WaitGroup
			mu sync.RWMutex
		)
		m := map[int]int{}
		for i := range b.N {
			wg.Add(1)
			go func() {
				mu.Lock()
				m[i] = i
				mu.Unlock()
				wg.Done()
			}()
		}
		wg.Wait()
	})
}

Swiss Map -

go test -v ./ -bench=BenchmarkMap
goos: darwin
goarch: arm64
pkg: test
cpu: Apple M1
BenchmarkMap
BenchmarkMap/map
BenchmarkMap/map-8               2043374               622.9 ns/op
PASS
ok      test    2.088s

Swiss map - 1 CPU

GOMAXPROCS=1 go test -v ./ -bench=BenchmarkMap
goos: darwin
goarch: arm64
pkg: test
cpu: Apple M1
BenchmarkMap
BenchmarkMap/map
BenchmarkMap/map                 2083174               545.1 ns/op
PASS
ok      test    2.384s

Old Map

GOEXPERIMENT=noswissmap go test -v ./ -bench=BenchmarkMap
goos: darwin
goarch: arm64
pkg: test
cpu: Apple M1
BenchmarkMap
BenchmarkMap/map
BenchmarkMap/map-8               2166986               511.3 ns/op
PASS
ok      test    2.296s

Old map - 1 CPU

GOMAXPROCS=1 GOEXPERIMENT=noswissmap go test -v ./ -bench=BenchmarkMap
goos: darwin
goarch: arm64
pkg: test
cpu: Apple M1
BenchmarkMap
BenchmarkMap/map
BenchmarkMap/map                 2067202               574.8 ns/op
PASS
ok      test    1.963s

Когда переезжал с php на go были такие же ощущения, но со временем это развеивается и с идиоматикой go начинаешь писать по-другому. Не стоит привязываться к конкретным фичам яп, это всего лишь инструмент. Та же аналогия из комментария выше - "я не говорю на французском из-за того,что там нет нескольких слов, которые мне нужны/нравятся". Попробуйте переосмыслить то, что используете на вашем яп и как это можно спроецировать на другой, откроете для себе много нового и интересного. Да, это выводит мозг из зоны комфорта, но это определенно улучшает восприятие и понимание того, что вы делаете.

Для самих же переменных, что используются внутри горутин память берётся с хипа (ограничены только размером "физического" хипа, т.е. объемом памяти сколько есть на машине).

Не нашел подтверждения этого утверждения. Разве аллокация памяти в горутинах происходит не в самом стеке этой горутины? А расширение стэковой памяти как раз идет за счет запроса выделения из общего хипа.

Кстати, хочу отдельно сказать про поиск работы по ИП внутри российского сегмента. При таком поиске стоит учитывать, что при длительном сотрудничестве с одной компанией, существуют риски появления вопросов у налоговой службы, т.к. такое сотрудничество может быть воспринят налоговой, как желание работодателя уклониться от выплаты налогов.

Это реальный кейс? И о каких длительных сроках идет речь? В моем понимании в РФ человек для своей деятельности может выбрать любой статус - работать как физ лицо, ип или же юр лицо . Для налоговой главное это плати и сдавай отчетные документы вовремя. А уклонение от налогов это по большей части скрытие своего реального дохода.

Поддерживает ли werf какое то решение из коробки для multi-repo проектов аля микросервисов? Или же конфиги нужно мержить ручками?

Information

Rating
Does not participate
Registered
Activity