Pull to refresh
91.7
Karma
2
Rating
Sergey Vasiliev @foto_shooter

Пользователь

  • Followers 18
  • Following

Как Visual Studio 2022 съела 100 Гб памяти и при чём здесь XML бомбы?

Не думаю, но у них явно есть определённые проблемы в процедурой фидбека. Целая история была, про которую можно отдельную заметку писать.

Первое - нельзя оставить фидбек просто зарегистрировавшись на форуме (или я не понял, как). Нужно обязательно открыть Visual Studio, нажать там на соответствующую кнопку, после чего происходит редирект на сайт, где после авторизации можно оставить репорт. При том, что я был авторизован на сайте, при переходе на него через Visual Studio авторизация слетала, а залогиниться я не мог (не осталось скриншота ошибки).

В итоге после нескольких попыток всё-таки удалось. Оформил репорт, всё красиво выглядит, все есть - успокоился.

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

Окееей... оставил как есть. В итоге после первого комментария бота заголвок всё же был исправлен (я не понял, то ли со стороны MS, то ли с моей стороны как-то запрос на правки всё же прошёл), но... сломалась вся разметка. Картинки, списки, ссылки - всё превариталось в сплошное полотно текста.

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

Через какое-то время всё чинится само (или не само, вообще не понимаю, как там всё работает), но... из репорта пропадает сам XML-файл.

Пришлось зааттачить его в комментариях.

Целое приключение, в общем.

Как Visual Studio 2022 съела 100 Гб памяти и при чём здесь XML бомбы?

А нафиг какой то кал вставлять в XML? Он даже не читабельный. 

Про это написано в статье:

Могут возникнуть 2 вопроса:

1. Зачем делать какие-то странные XML и добавлять их в проекты?

2. Что здесь вообще происходит?

Что ж, давайте разбираться...

Про Visual Studio.

да вижуал студио 64 битная есть уже давно, просто раньше был выбор между 32 битной и 64 битной

Нет, предыдущие выпуски Visual Studio (до 2022) - 32-битные.

Как Visual Studio 2022 съела 100 Гб памяти и при чём здесь XML бомбы?

 Вы же можете написать бесконечный цикл который жрет все ядра ЦПУ?

Если я просто напишу бесконечный цикл и не стану компилировать/запускать приложение, мне бы не хотелось, чтобы IDE сама попробовала его вычислить, начала жрать ресурсы и зависла . :)

Не было бы разговоров, если я бы я написал код, уязвимый к данной проблеме, запустил его и подал на вход соответствующий файл - окей, сам виноват.

Но здесь проблема однозначно на стороне IDE - нужно ограничивать такие операции. Собственно, я думаю факт, что в VS 2019 этой проблемы и не было и что MS фиксят этот баг в VS 2022, свидетельствует о том, что это именно не ожидаемое поведение.

Как Visual Studio 2022 съела 100 Гб памяти и при чём здесь XML бомбы?

VS 2019 и более ранние выпуски - 32-битные. 64-битность VS 2022 - главная фишка версии новой IDE. Думаю, особенно ждали этого разработчики плагинов для VS. :)

Как Visual Studio 2022 съела 100 Гб памяти и при чём здесь XML бомбы?

Я сначала подумал, что в Visual Studio 2019 срабатывает какая-то защита, но всё оказалось немного интереснее.

Попробовал добавить XML'ку из статьи - поведение поначалу повторялось - GUI повис, Visual Studio начала отжирать память. На отметке ~3Гб GUI отвис, потребляемая память сбросилась примерно до 200Мб, но... потом снова начала расти. Примерно до 3Гб - сборс до 300Мб, 3Гб - 300Мб. Уже несколько циклов таких наблюдаю - всё не сдаётся, пытается распарсить.

Какая настойчивость, однако! :)

Оптимизация .NET приложений: большой результат маленьких правок

Насчет Count (и Any) загляните в исходники LINQ - он достаточно хитер и если видит что IEnumerable это на самом деле List или Array то вызовет их свойства Count и Length напрямую.

Безпредикатная версия Count - да, я как раз приводил имплементацию в статье. В Any такого нет. Ссылка на referencesource. В .NET завезли, похоже. Ссылка.

Неужели чтобы догадаться что params передается как массив необходимо было дизассемблировать в IL? Да он же в сигнатуре даже объявлен как массив.

Люблю в IL лазить, чтобы прояснять для себя разные моменты. Например, про передачу явного null (что он не заворачивается), на оптимизации вызовов без аргументов тоже было интересно посмотреть. Про атрибут не знал. Да и в общем, думаю, кому-то может быть интересно, что там под капотом.

collection.Where(predicate).Skip(12).Any()

Лично мне не очень нравится читаемость этого кода (может просто не привык) + создание итераторов.

PVS-Studio для JetBrains CLion: через тернии к звёздам

Добрый день!

Прошу прощения за возникшую путаницу. Со статьёй мы немного косанули, выпустив её до релиза, при том что в самой статье релизные ссылки. Соответственно, при загрузке C++ ядра выгружалась версия, несовместимая с плагином для CLion.

Сейчас релиз прошёл и всё должно работать нормально. Я проверил - в JetBrains Marketplace лежит плагин 7.14, у нас на сайте - аналогично. Также у нас сайте лежат C++ ядро версии 7.14.

Пожалуйста, попробуйте заново скачать и установить плагин и ядро анализатора (релизные версии). После этого прошу дать знать, всё ли заработало.

Если вдруг что-то не получится - обязательно пишите мне в ЛС, будем решать в индивидуальном порядке. :)

Оптимизация .NET приложений: большой результат маленьких правок

Отличная статья

Спасибо!

рассматривались ли варианты вроде NetFabric.Hyperlinq или StructLinq, что-бы максимально сохранить простоту LINQ и не переписывать всё на циклы

Нет, я про такое не слышал. На самом деле LINQ осталось довольно много - как я писал в статье, всё точно не переписывалось, запросы устранялись точечно по результатам профилирования. Я не скажу точно, сколько LINQ запросов было переписано на циклы, но это точно даже не несколько десятков.

В общем и целом LINQ по коду осталось много, просто теперь у нас есть лучшее понимание того, где его можно использовать достаточно спокойно, а где лучше подумать или сразу воздержаться. :)

Оптимизация .NET приложений: большой результат маленьких правок

Ну, не совсем. Мы же не берём исходную коллекцию "as is", а изменяем её - для каждого элемента вызывается Clone. То есть просто указать её в конструкторе или передать в AddRange не выйдет. LINQ с Select сюда тоже добавлять не хотелось понятно по каким причинам. :)

Оптимизация .NET приложений: большой результат маленьких правок

Спасибо! Нас тоже очень порадовал. :)

Статический анализ защищает ваш код от бомб замедленного действия

Можете написать нам в саппорт, пожалуйста? Хочется перевести общение туда, так как там будет удобнее общаться, выяснять какие-то детали. :)

Сразу прошу написать вопросы, которые у нас возникли по анализу проектов на Unity 2020 - интересно. Ну и с зависанием будем разбираться, конечно.

Статический анализ защищает ваш код от бомб замедленного действия

Добрый день! :)

Да, есть такая проблема - более подробно я описывал это в отедльной заметке (причины проблемы и способы лечения). Если вкратце - в редакторе нужно отключить опцию "Player projects".

Вот сама заметка.

Пожалуйста, напишите, подошло ли Вам решение и помогло ли. :)

Подводные камни при работе с enum в C#

Подводные камни при работе с enum в C#

Не слышал про такой, возьму на заметку на всякий.

Мы недавно занимались оптимизациями, как раз дописал статью на эту тему. Были разного рода оптимизации, в том числе в некоторых местах приходилось экономить на каждом временном объекте.

Собственно, насколько помню, с упаковкой проблемы были в одном месте - описанном в этой статье. Может быть повезло просто, конечно. А может и нет. :)

Подводные камни при работе с enum в C#

Тут уж мне сложно судить - на Питоне не писал, так что поверю на слово. :)

Подводные камни при работе с enum в C#

Действительно... Здорово же! :)

Подводные камни при работе с enum в C#

Правда ваша.

Но в случае для .NET Framework, в принципе, достаточным оказалось посмотреть выделение памяти / сборку мусора.

Подводные камни при работе с enum в C#

А можно ссылочку на PR или иное место, где это реализовано? Интересно глянуть. :)

Подводные камни при работе с enum в C#

HasFlag вообще расстроил. :(

При его вызове аж 2 явные команды упаковки, если мы работаем напрямую с экземпляром перечисления.

Код на C#:

enum Origin { None }

void Test(Origin origin) 
{     
  var eq = origin.HasFlag(Origin.None); 
}

IL:

.method private hidebysig instance void  
  Test(valuetype HasFlagTest.Program/Origin origin) cil managed
{
  // Code size       19 (0x13)
  .maxstack  8
  IL_0000:  ldarg.1
  IL_0001:  box        HasFlagTest.Program/Origin
  IL_0006:  ldc.i4.0
  IL_0007:  box        HasFlagTest.Program/Origin
  IL_000c:  call       instance bool [mscorlib]System.Enum::HasFlag(class [mscorlib]System.Enum)
  IL_0011:  pop
  IL_0012:  ret
}

Information

Rating
926-th
Location
Скопин, Рязанская обл., Россия
Works in
Date of birth
Registered
Activity