Что здесь происходит — репозиторий (слой persistence) возвращает данные сотрудника из нескольких частей в виде доменного объекта, его части как-то фильтруются перед показом юзеру, затем преобразуются с помощью Autofac в DTO и улетают выше — в вебсервис.
Вроде бы ничего сложного, но — даже при простом перемещении текстового курсора по классу с несколькими такими методами, задержки между нажатием клавиши и перемещением курсора могут составлять 10-15 секунд. Это как-то совсем ненормально. Даже если закрыть файл, решарпер продолжит чего-то напряженно думать, и более того — даже запущенная сборка проекта не останавливает размышления решарпера, которые уже не нужны.
Я не думаю, что в разборе подобного кода есть какая-то большая алгоритмическая сложность, уж не хуже развесистого LINQ.
Можете починить?
Re: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, Слава, Вы писали:
С>В проекте используется LanguageExt.Core 1.9.2 (не спрашивайте меня — зачем оно, его туда уже притащили и с этим надо жить)
Спасибо, сделал реквест
С>Я не думаю, что в разборе подобного кода есть какая-то большая алгоритмическая сложность, уж не хуже развесистого LINQ.
Вообще-то есть, там везде generic-методы, для которых надо типы вывести.
С>Можете починить?
Будем стараться. Полный пример и снятый снепшот здорово бы помогли.
Re[2]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, qxWork, Вы писали:
W>Здравствуйте, Слава, Вы писали:
С>>В проекте используется LanguageExt.Core 1.9.2 (не спрашивайте меня — зачем оно, его туда уже притащили и с этим надо жить) W>Спасибо, сделал реквест
С>>Я не думаю, что в разборе подобного кода есть какая-то большая алгоритмическая сложность, уж не хуже развесистого LINQ. W>Вообще-то есть, там везде generic-методы, для которых надо типы вывести.
Подобная же фигня с кодом, использующим библиотеку SPMeta2 (SharePoint)
Структура кода — примерно тот же дурдом, что показан выше, => xxx.foo(yyy => yyy.boo (zzz => zzz.bar(... (стадо вложенных лямбд с шаблонными методами), только библиотека другая.
Блин, куда мир катится. Я уж начал надеяться что никогда больше не увижу ничего похожего на шаманство а-ля boost.
Re[2]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, bnk, Вы писали:
bnk>Подобная же фигня с кодом, использующим библиотеку SPMeta2 (SharePoint) bnk>Структура кода — примерно тот же дурдом, что показан выше, => xxx.foo(yyy => yyy.boo (zzz => zzz.bar(... (стадо вложенных лямбд с шаблонными методами), только библиотека другая. bnk>Блин, куда мир катится. Я уж начал надеяться что никогда больше не увижу ничего похожего на шаманство а-ля boost.
Изначально в проект это было притащено скальщиками, а потом, когда скальщики прекратили работу над проектом и вообще ушли из этой поганенькой конторы — было решено оставить подобный код в качестве индусозащитной меры. От архитектора-индуса это не спасает, но по крайней мере рядовых кодеров-индусов в бэкенде нет (они все в БД, хранимки в пять экранов пишут... )
Re[3]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, Слава, Вы писали:
С>Я поинтересуюсь полным примером. Что вы подразумеваете под снепшотом, дамп процесса снять? Как вам его передать?
NDA подпишем, если надо.
Вот инструкция.
Можно стукнуться ко мне в скайп sergey.coox — помогу снять, могу сразу посмотреть на происходящее, если исходники показывать другим людям можно.
Re[4]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, Слава, Вы писали:
bnk>>Блин, куда мир катится. Я уж начал надеяться что никогда больше не увижу ничего похожего на шаманство а-ля boost.
С>Изначально в проект это было притащено скальщиками, а потом, когда скальщики прекратили работу над проектом и вообще ушли из этой поганенькой конторы — было решено оставить подобный код в качестве индусозащитной меры. От архитектора-индуса это не спасает, но по крайней мере рядовых кодеров-индусов в бэкенде нет (они все в БД, хранимки в пять экранов пишут... )
Вообще мысль. Может к нам в текущий проект такое г. протащить, в качестве индусозащиты. Неплохое словечко кстати
Выглядит достаточно злым, думаю такого количества стрелочек и уголков хватит, чтобы обезвредить по крайней половину наших индусов.
Re: Resharper дико тормозит на файлах с LanguageExt
Алгоритмически это самый сложный и дорогой для Overload resolution алгоритма пример. Гораздо дороже любого LINQ. И студия (точнее Roslyn) тоже страдает, просто делает это аккуратнее по отношению к работе в background потоках (то есть менее заметно для пользователя). Можете отключить ReSharper, например, выделить кусочек кода и вырезать его через ctr-x — у меня затыкается надолго.
Сложность во вложенных друг в друга лямбдах, при том, что каждая из них завернута в вызов метода с перегрузками. Каждая перегрузка это точка ветвления: предположим она подойдет, что тогда будет с кодом, который внутри лямбды. Сами можете оценить дерево ветвления и его глубину. Там есть, конечно, еще нюансы и оптимизации, которые могут сильно помочь в каких-то других случаях — но в данном нет. Он самый суровый.
Что мы можем сделать — это поработать над отзывчивостью. Тут есть что улучшать и куда копать. Но по сути разогнать алгоритм Overload resolution здесь не слишком реалистично.
Re[2]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, ollka, Вы писали: O>Что мы можем сделать — это поработать над отзывчивостью. Тут есть что улучшать и куда копать. Но по сути разогнать алгоритм Overload resolution здесь не слишком реалистично.
Благодарю вас за ответ.
У меня есть пожелание — если файл не менялся, то не анализировать его еще раз. А если его закрыли — так тем более не анализировать, или уводить анализ в фон. Какое-то кэширование использовать, что-ли... или быть может некий монитор, показывающий "а что сейчас делает Решарпер?" с возможностью указать некоему процессу "умри" или же понизить приоритет конкретно этого действия или класса действий.
Если изменений в файле нет, или изменение не несёт смысла — к одному пробелу второй добавили, один перенос строки двумя заменили, то что должно заново анализироваться так упорно, что даже прокрутка не работает?
В моём проекте в итоге решили бороться с тормозами следующим образом:
(создали файл с реально используемыми элементами)
using LanguageExt;
namespace Infrastructure.Extensions
{
public static class LanguageExtExtensions
{
public static Ret match<L, R, Ret>(Either<L, R> either, Func<R, Ret> Right, Func<L, Ret> Left)
=> Prelude.match(either, Right, Left);
public static Unit match<L, R>(Either<L, R> either, Action<R> Right, Action<L> Left)
=> Prelude.match(either, Right, Left);
public static R match<T, R>(Option<T> option, Func<T, R> Some, Func<R> None)
=> Prelude.match(option, Some, None);
public static Either<L, R> Right<L, R>(R value)
=> Prelude.Right<L, R>(value);
public static Either<L, R> Right<L, R>(R? value) where R : struct
=> Prelude.Right<L, R>(value);
public static Either<L, R> Left<L, R>(L value)
=> Prelude.Left<L, R>(value);
public static Either<L, R> Left<L, R>(L? value) where L : struct
=> Prelude.Left<L, R>(value);
public static Option<T> Some<T>(T value)
=> Prelude.Some(value);
public static Option<T> Some<T>(T? value) where T : struct
=> Prelude.Some(value);
}
}
(и стали везде использовать его, а не весь поперёк себя широкий LanguageExt)
using static Infrastructure.Extensions.LanguageExtExtensions;
Из этого же ясно, что сами создатели LanguageExt виноваты в тормозах — а зачем они засунули в один namespace вообще всё, что у них есть? Функциональщики такие функциональщики... avoid success at all costs.
using System;
namespace ReportMaster.DataSource.Contract
{
public class SalesQueryResult
{
public DateTime Begin { get; set; }
public DateTime? End { get; set; }
public string FuelName { get; set; }
public decimal Dose { get; set; }
public decimal RealDose { get; set; }
public int DispenserId { get; set; }
public int DispenserNumberOnSide { get; set; }
public int SideNumber { get; set; }
public int TradeOperationId { get; set; }
public string Username { get; set; }
public int UserId { get; set; }
public string PaymentMethod { get; set; }
public int PaymentMethodId { get; set; }
public decimal Price { get; set; }
public decimal FuelVolume { get; set; }
public decimal MoneySumm { get; set; }
public int FuelId { get; set; }
public string Priceing { get; set; }
public decimal Weight { get; set; }
public double Density { get; set; }
public int DocumentId { get; set; }
public int ShiftId { get; set; }
public int ShiftNumber { get; set; }
public int SubShiftId { get; set; }
public int SubShiftNumber { get; set; }
public int PriceingId { get; set; }
public string PriceingName { get; set; }
public decimal TotalizerBefore { get; set; }
public decimal TotalizerAfter { get; set; }
}
}
На всякий случай еще добавлю. Для решения проблемы алгоритмической сложности достаточно по возможности выносить подвыражения в отдельные типизированные переменные. Ветвления начинаются именно когда аргументом вызова метода является лямбда.
Про прокрутку. У меня вот с ней не воспроизвелась проблема, даже если этот код раскопировать на 5 методов. Может быть снэпшот сможете снять (подскажу как) или солюшен прислать (под NDA)? У меня Решарпер затыкается на явных действиях (вызов квик фиксов) итп — тут понятно что можно сделать, но просто тайпить или читать код не мешает. Студия иногда выкидывает окно с заголовком Copy и висит прямо по ходу редактирования, но это Микрософт.
Re[4]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, Слава, Вы писали:
С>Visual Studio Enterprise 2015 update 3 (14.0.25431.1), Resharper Ultimate 2016.2.2
В ЕАР 2017.2 должно стать намного лучше. Билд можно взять на пробу отсюда
Заранее спасибо
Re[2]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, qxWork, Вы писали:
W>В ЕАР 2017.2 должно стать намного лучше. Билд можно взять на пробу отсюда W>Заранее спасибо
Здравствуйте!
С новым решарпером студия действительно стала намного меньше тормозить. Однако появились не встречавшиеся раньше проблемы — например, подсказки в object initializer не сразу срабатывают, часть полей видна сразу, часть нужно как бы "выпрашивать" через многократное нажатие ctrl-space. И решарпер время от времени ловит какие-то исключения внутре самого себя.
Re[3]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, Слава, Вы писали:
С>Здравствуйте, qxWork, Вы писали:
W>>В ЕАР 2017.2 должно стать намного лучше. Билд можно взять на пробу отсюда W>>Заранее спасибо
С>Здравствуйте!
С>С новым решарпером студия действительно стала намного меньше тормозить. Однако появились не встречавшиеся раньше проблемы — например, подсказки в object initializer не сразу срабатывают, часть полей видна сразу, часть нужно как бы "выпрашивать" через многократное нажатие ctrl-space. И решарпер время от времени ловит какие-то исключения внутре самого себя.
Кэш решарпера чистить пробовали ?
Ну так это же предварительная версия, а не релиз
Здравствуйте, _NN_, Вы писали:
С>>С новым решарпером студия действительно стала намного меньше тормозить.
Это радует.
С>>Однако появились не встречавшиеся раньше проблемы — например, подсказки в object initializer не сразу срабатывают, часть полей видна сразу, часть нужно как бы "выпрашивать" через многократное нажатие ctrl-space. И решарпер время от времени ловит какие-то исключения внутре самого себя.
Ну исключения внутри себя — это нормально — парсер исторически на них написан.
А вот подсказки... Я правильно понимаю, что речь о полях и свойствах, которые в интеллисенс (он же code completion) не сразу появляются?
Re[5]: Resharper дико тормозит на файлах с LanguageExt
Вы не мне ответили.
W>Ну исключения внутри себя — это нормально — парсер исторически на них написан. W>А вот подсказки... Я правильно понимаю, что речь о полях и свойствах, которые в интеллисенс (он же code completion) не сразу появляются?
Да, именно они появляются не сразу, то есть например у класса 8 свойств, в подсказке будет только 4, через некоторое время остальные подтягиваются. Возможно это связано с тем, что если класс свежесозданный, меньше минуты назад, то решарпер просто не успевает его целиком "заглотить и прожевать".
Re[6]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, Слава, Вы писали:
С>Да, именно они появляются не сразу, то есть например у класса 8 свойств, в подсказке будет только 4, через некоторое время остальные подтягиваются. Возможно это связано с тем, что если класс свежесозданный, меньше минуты назад, то решарпер просто не успевает его целиком "заглотить и прожевать".
Хм, прям очень интересно.
Если воспроизводится, было бы чудесно получить performance snapshot. Начать профиляцию, вызвать комплишен, дождаться пока все свойства появятся и снять снепшот.
Заранее спасибо.
Re[3]: Resharper дико тормозит на файлах с LanguageExt
Здравствуйте, Слава, Вы писали:
С>С новым решарпером студия действительно стала намного меньше тормозить.
Зато умирает по Ctrl-Q. При этом содержимое тултипа она таки успевает показать, а вот на отрисовке рамки тултипа все умирает. Воспроизводится на 15.2, 15.3, 2017.1.3, 2017.2 последний
С>И решарпер время от времени ловит какие-то исключения внутре самого себя.
ЕАР все такие. Часть исключений живет и в релизах, просто мигалку отключают.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Зато умирает по Ctrl-Q. При этом содержимое тултипа она таки успевает показать, а вот на отрисовке рамки тултипа все умирает. Воспроизводится на 15.2, 15.3, 2017.1.3, 2017.2 последний
Какой-то конкретный пример? Или всегда?