Еще вчера дописал статью, где это меряется.
Первая часть серии про то, из чего физически сделан оператор
go f(). Та самая, из которой сюда уезжали выкинутые куски: select с мьютексом, потолки потоков, переезд стека.Зашел с вопроса, который на собеседованиях задают все, а понимают единицы: почему поток дорогой, а горутина нет. Все замеры свои, на одной машине (i9-14900KF, Linux), рядом тридцать распакованных релизов Go для сверки фактов.
Пара цифр, которых в канале еще не было.
- Миллион горутин: 2.6 ГБ, по 2049 байт стека и 601 байту кучи на штуку.
- Переключение: 106 нс у горутины против 1360 нс у потока, причем мерил при
GOMAXPROCS=1. Дешевизна не из параллельности, ядро в переключении горутины не участвует вообще.Потолок, на котором недавно умер мой тест, в статье дожат до конца: ядро было готово отдать полмиллиона, обрубил
systemd.Вторая часть через неделю: переезжающий стек и вытеснение сигналом ОС. Статья в целом готова, жду релиза 1.27, финальных замеров и вычитки.
Статья: https://habr.com/ru/articles/1070050/
Код всех замеров: https://github.com/dsbasko/sandbox-gorutines
