Оптимизируем код на Go в 10 раз | Как избежать false sharing в Go

แชร์
ฝัง
  • เผยแพร่เมื่อ 28 ก.ย. 2024

ความคิดเห็น • 74

  • @vladimir_balun_programming
    @vladimir_balun_programming  29 วันที่ผ่านมา +1

    Присоединяйтесь к моему каналу в Телеграм: t.me/vladimir_balun_programming

  • @denissemikin2683
    @denissemikin2683 5 หลายเดือนก่อน +31

    Данная логика с оптимизацией хорошо рассписана в книжке «100 ошибок Go и как их избежать» в последней главе.

  • @azizmavlyanov3145
    @azizmavlyanov3145 5 หลายเดือนก่อน +9

    Владимир, как обычно, топ-темы рассматриваешь. Очень хочется увидеть и поработать с такими необычными темами и на твоем курсе по concurreny в go. За данный видос огромный респект!

    • @vladimir_balun_programming
      @vladimir_balun_programming  5 หลายเดือนก่อน +1

      Спасибо, курс как раз будет 2 мая - там в том числе и это разбирается)

  • @viktorkram2531
    @viktorkram2531 5 หลายเดือนก่อน +12

    Крайне интересная информация, спасибо! Коротко и очень необычно) Спасибо!

  • @martirosharutunyan6572
    @martirosharutunyan6572 5 หลายเดือนก่อน +6

    Ну брат ну ты даёшь это всё очень круто. Думаю всем будет уроком немножко процессор и память изучить.

  • @AleksandrRasskazov
    @AleksandrRasskazov 5 หลายเดือนก่อน +1

    Приятненько. Это похоже как и на порядок полей в структурах

  • @БорисКрасных-ц8н
    @БорисКрасных-ц8н 4 หลายเดือนก่อน +4

    Да, Балун реально шарит, мощь. Нетривиальный ролик. И классный пример того как понимание подкапотной работы помогает реально оптимизировать код...

  • @lmorozkol
    @lmorozkol 5 หลายเดือนก่อน +3

    чудеса на виражах прям какие-то)

  • @czm41k
    @czm41k 6 วันที่ผ่านมา

    Очень круто, спасибо

  • @ТимофейЁлкин-о9е
    @ТимофейЁлкин-о9е 5 หลายเดือนก่อน +2

    Супер! Респект и удачи тебе!

  • @nikmy_
    @nikmy_ 5 หลายเดือนก่อน +1

    Очень известная штука в профессиональных c++ кругах. Если вместо sequential consistency бахнуть acquire-release семантику, вы ускорите ещё раза в 3-4) Но в го отказались от такого для простоты (см. go memory model).
    Очень подойдёт тем, кто занимается разработкой чего-то низкоуровнего, я сам был в шоке когда увидел в первый раз такие оптимизации)

  • @amb7048
    @amb7048 5 หลายเดือนก่อน +2

    Какие вы ресурсы изучали чтобы знать тонкости всего процессора и библиотек языка? Вы настолько детально все изучили, что как будто бы вы с другой планеты) Было очень интересно!

    • @vladimir_balun_programming
      @vladimir_balun_programming  5 หลายเดือนก่อน +1

      Я не знаю очень много всего все еще - а то, что знаю, просто последовательный путь изучения тем, которые постепенно друг с другом переплетаются)

  • @sovrinfo
    @sovrinfo 5 หลายเดือนก่อน +2

    Спасибо, очень интересное видео!

  • @roman_zh1
    @roman_zh1 5 หลายเดือนก่อน +2

    Пушка. Наконец-то я понял зачем нужно знать устройство памяти и всего прочего, прям конкретный кейс, спасибо)

    • @vladimir_balun_programming
      @vladimir_balun_programming  5 หลายเดือนก่อน

      Нужно не всегда, но иногда эти знания бывают очень полезными)

  • @thegeneralopinion9713
    @thegeneralopinion9713 2 หลายเดือนก่อน

    почему цикл не в самом начале функции benchmark?
    for j := 0; j < b.N; j++ {

  • @timurakhalaya6289
    @timurakhalaya6289 5 หลายเดือนก่อน +2

    alignment это выравнивание , offset смещение)
    годный контент

    • @vladimir_balun_programming
      @vladimir_balun_programming  5 หลายเดือนก่อน

      Все так)

    • @jin_x_
      @jin_x_ 5 หลายเดือนก่อน

      Если уж придираться к неймингу, то такой заполнитель обычно называют padding.

    • @TomLeeGun
      @TomLeeGun 5 หลายเดือนก่อน

      это называется wet blanket) а если серьезно, то везде используется именно field alignment. учите матчасть!)

  • @unciauncia
    @unciauncia 5 หลายเดือนก่อน +1

    А какие минусы у такой оптимизации? Получается, что мы резервируем себе участок памяти кэша в котором полезных данных 4 байта, а всё остальное не используется никак? Как будто это оптимизация будет сильно отъедать память, когда количество горутин будет значительно больше, чем число ядер, и тогда относительно не быстрая зашаренные данные, будут эффективнее по памяти, но медленнее исполняться. Вопрос какой баланс в итоге лучший, всегда по ситуации?

    • @stupnum8764
      @stupnum8764 5 หลายเดือนก่อน

      Нуу, 64 байта это очень немного. L1 кеш на большинстве современных процессоров имеет объем 32kb, соответственно туда поместится 512 таких переменных на одно ядро, но насолько я понимаю при работе в одном потоке процессор не будет загружать в себя данные всех переменных, хотя это под вопросом. Я думаю если протестировать данный лайфхак на большом количестве корутин, то получится что он все равно будет значительно быстрее, чем без этого приема. Хотя не уверен, надо бы протестировать.

  • @sfdb97fsasdfasrewerwerzgdfgsda
    @sfdb97fsasdfasrewerwerzgdfgsda 5 หลายเดือนก่อน

    Желательно выравнивать к длине кешлинии архитектуры на которой запускается код, иначе оптимизации не будет, т.к значения будут затирать друг друга.

  • @unlite2896
    @unlite2896 3 หลายเดือนก่อน

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

  • @sabbath359
    @sabbath359 11 วันที่ผ่านมา

    А если у нас куча других задач помимо счетчика, ? Могу быть не прав, но это звучит так как будто в вакууме это финт ушами уровня магистра, но если взять реальный сервис, который, условно, съедает 70% ресурсов машины, ? Или еще лучше рассмотреть ситуацию , когда запросов настолько много, что условный сервис должен ?

  • @АнтонИцкович-х7у
    @АнтонИцкович-х7у 5 หลายเดือนก่อน

    ШИКАААРРРРРРНООО!!! брат давай такие видео по всем темам и ты ТОП! такой шикраный контент и на русском

  • @rasZam
    @rasZam 5 หลายเดือนก่อน

    Привет. Не подскажешь какой у тебя доп. монитор стоит?

  • @io0312
    @io0312 5 หลายเดือนก่อน

    Можно исходники?

  • @МихаилИсаев-з2с
    @МихаилИсаев-з2с 4 หลายเดือนก่อน

    Я так понял у Вас intel. Вот не могу, сколько не пробую, на M1 хак повторить, максимальной производительности добиваюсь при атомиках и дальше никак.
    Не получилось нагуглить как с кэш линией работает М1 Pro. Если у кого-то есть инфа, буду благодарен, потому что интересно повторить выравнивание на своем компе.

    • @thegeneralopinion9713
      @thegeneralopinion9713 2 หลายเดือนก่อน

      Ты, наверно, просто тест с атомиками запускал. А надо шардированный тест со смещением структуры AtomicCounter

  • @profered
    @profered 5 หลายเดือนก่อน +3

    ниче не понятно, но очень интересно

    • @billjohnes9380
      @billjohnes9380 5 หลายเดือนก่อน

      Попробуйте почитать мой большой комментарий-ответ другому собеседнику ниже про 64-байтные блоки адресного пространства.
      Возможно, что-то прояснится.

  • @sergiocoder
    @sergiocoder 5 หลายเดือนก่อน

    В самом начале у нас вроде как у каждого ядра свой кэш, а после последней версии у всех ядер один кэш(-линия)? Или это разные кэши?
    В целом прикольная оптимизации, но насколько понял, ее эффективность зависит от конкретной архитектуры/модели процоессора, т.е. где-то можно не сработать. Хотя, если дело доходит до такой низкоуровневой ерунды, то наверное заранее известно, на каких процессорах будет запускаться код в проде )

  • @alexandrlapin3641
    @alexandrlapin3641 5 หลายเดือนก่อน +1

    Подскажите , а на плюсах такие проблемы возникают?

    • @dmikoss
      @dmikoss 5 หลายเดือนก่อน +1

      Это актуально для всех языков, так как проблема завязана на принципах работы cpu

    • @vladimir_balun_programming
      @vladimir_balun_programming  5 หลายเดือนก่อน

      @@dmikoss плюсую)

  • @vladimireliseev7602
    @vladimireliseev7602 5 หลายเดือนก่อน +1

    Забавно, возможно я что-то делаю ни так, но у меня все варианты не сильно друг от друга отличаются по производительности:
    BenchmarkAtomicCounter-10 10 1538 ns/op
    BenchmarkMutexCounter-10 10 412.5 ns/op
    BenchmarkRWMutexCounter-10 10 658.3 ns/op
    BenchmarkShardedAtomicCounter-10 10 570.9 ns/op
    BenchmarkAtomicCounterOptimize-10 10 775.0 ns/op

    • @MIRISU2
      @MIRISU2 5 หลายเดือนก่อน

      я тоже попробовал проделать всё тоже самое. ShardedAtomic c alignment не сильно ушёл от Atomic и ShardedAtomic. 349.7 ns/op, 455.7 ns/op, 385.9 ns/op соответственно.

  • @silentroach
    @silentroach 5 หลายเดือนก่อน

    Жаль что go не оптимизирует это сам на этапе компиляции

  • @НиколайВикторович-х3г
    @НиколайВикторович-х3г 5 หลายเดือนก่อน

    Коротко о том как увеличить использование памяти приложения в 16 раз )

    • @НиколайВикторович-х3г
      @НиколайВикторович-х3г 5 หลายเดือนก่อน

      @@doingwell5629 я имел ввиду в структуре 🙂

    • @vladimir_balun_programming
      @vladimir_balun_programming  5 หลายเดือนก่อน +5

      @@НиколайВикторович-х3г это почти всегда компромисс - что-то получаем, чем-то жертвуя при этом

  • @vladislav_artyukhov
    @vladislav_artyukhov 3 หลายเดือนก่อน

    Цыганские фокусы

  • @XpIOHdeJIb3000
    @XpIOHdeJIb3000 5 หลายเดือนก่อน

    зачем мьютекс на чтение? Какаю то ересь прочитать невозможно, либо текущее значение, либо текущее + 1

  • @alekseevserge
    @alekseevserge 5 หลายเดือนก่อน +4

    Осталось только коммент в коде написать, чтобы другой программист не грохнул неиспользуемую память)

  • @beast0608dihdbdn
    @beast0608dihdbdn 5 หลายเดือนก่อน +7

    Вова, ты крут, очень понравилась данная рубрика, спасибо!)

  • @__kawaii
    @__kawaii 3 หลายเดือนก่อน

    Как ты вообще додумался до этого? Мозг капитальный. Постфактум, конечно, кажется очевидным, но изначально к этой мысли бы никогда в жизни не пришел самостоятельно

  • @vladislav_artyukhov
    @vladislav_artyukhov 3 หลายเดือนก่อน

    На превьюшку поставить:
    _ [60]byte

    Это увеличит скорость кода в 10 раз

  • @theprogrammer256
    @theprogrammer256 5 หลายเดือนก่อน +2

    Круто! Вы фокусник! ))

  • @henrytavilla
    @henrytavilla 5 หลายเดือนก่อน +2

    Спасибо за крутой лайфхак! Полезно 😊

  • @nikolaykozlov4888
    @nikolaykozlov4888 5 หลายเดือนก่อน +2

    Млин, Вов, как всегда - огонь!!!

  • @kostya7469
    @kostya7469 5 หลายเดือนก่อน +2

    Очень интересно! спасибо

  • @dobermangood
    @dobermangood 5 หลายเดือนก่อน

    Круто! Не думал попробовать решить 1 billion row challenge на golang?

  • @nickolaizein7465
    @nickolaizein7465 5 หลายเดือนก่อน

    Так выравнивание получается как бы "растягивает" счётчик на какое-то кол-во байт, хотя по факту их не использует, чтоб другой счётчик гарантировано попал в другую кэш линию ?

  • @mordva756
    @mordva756 5 หลายเดือนก่อน +1

    Это решение будет ускорять в 10 раз и при наличии другой работы в коде? Помимо инкрементирования счетчика, приложение делает ещё что-то и переменные тоже могут попадать в кэш. Возможно не очень понял, но мы как будто затрем весь кэш при инкрементироварии счётчика таким способом и это замедлит код вокруг

    • @billjohnes9380
      @billjohnes9380 5 หลายเดือนก่อน +1

      Это если счётчик будет разбит на 1024 shard'а для 64K cache'а L1 или на 4096 shard'а для 256К.
      Пока на shard'ы тратится малый процент cache'а, такой опасности нет.

  • @itkrasavchik
    @itkrasavchik 5 หลายเดือนก่อน +2

    Прикольно ) Красавчик! ;)

  • @denyskanunnikov7521
    @denyskanunnikov7521 5 หลายเดือนก่อน

    добрый вечер, а есть ли публичный репозиторий с примером данного кода для более внимательного изучения? в записанном видео быстрое перемещение по коду и тем речи высокий, не всегда удобно для моментального восприятия

    • @КонстантинСердюк-ь5ю
      @КонстантинСердюк-ь5ю 5 หลายเดือนก่อน

      Есть курс по concurrency МФТИ , можешь посмотреть его , там 20+ часов :)

    • @denyskanunnikov7521
      @denyskanunnikov7521 5 หลายเดือนก่อน

      @@КонстантинСердюк-ь5ю а ссыль можно, пожалуйста?