Resharper дико тормозит на файлах с LanguageExt
От: Слава  
Дата: 02.12.16 14:47
Оценка:
Мой софт:
Visual Studio Enterprise 2015 update 3 (14.0.25431.1), Resharper Ultimate 2016.2.2

В проекте используется LanguageExt.Core 1.9.2 (не спрашивайте меня — зачем оно, его туда уже притащили и с этим надо жить)

Пример метода
  public Either<ControlException, BoringSectionDTO> RetrieveBoringSection(int employeeId)
            => Prelude.match(_securityService.GetCurrentUserId(), userId =>
                Prelude.match(
                    _boringSectionRepository.RetrieveBoringSection(employeeId, userId),
                    section =>
                        Prelude.match(
                            _subsection1SecurityService.ApplyFieldsSecurity(section.Subsection1),
                            succededSubsection1Applied =>
                                Prelude.match(
                                    _subsection2SecurityService.ApplyFieldsSecurity(
                                        section.Subsection2), succededSubsection2Applied =>
                                        Prelude.match(
                                    _subsection3SecurityService.ApplyFieldsSecurity(
                                        section.Subsection3), succededSubsection3Applied =>
                                        Prelude.match(
                                    _subsection4SecurityService.ApplyFieldsSecurity(
                                        section.Subsection4), succededSubsection4Applied =>

                                            Prelude.Right<ControlException, BoringSectionDTO>(
                                                new BoringSectionDTO
                                                {
                                                    Subsection1 = _typeAdapter
                                                        .Create
                                                        <MetadataObjectContainer<SubsectionType1>,
                                                            MetadataResponse<SubsectionType1DTO>>(
                                                                section.Subsection1),
                                                    Subsection2 = _typeAdapter
                                                        .Create
                                                        <MetadataObjectContainer<SubsectionType2>,
                                                            MetadataResponse<SubsectionType2DTO>>(
                                                                section.Subsection2),
                                                    Subsection3 = _typeAdapter
                                                        .Create
                                                        <MetadataObjectContainer<SubsectionType3>,
                                                            MetadataResponse<SubsectionType3DTO>>(
                                                                section.Subsection3),
                                                    Subsection4 = _typeAdapter
                                                        .Create
                                                        <MetadataObjectContainer<SubsectionType4>,
                                                            MetadataResponse<SubsectionType4DTO>>(
                                                                section.Subsection4),
                                                }),
                                    failToApply => failToApply),
                                    failToApply => failToApply),
                                    failToApply => failToApply),
                            failToApply => failToApply)
                    , failedToRetrieve => failedToRetrieve),
                failedToRertieve => failedToRertieve);



Что здесь происходит — репозиторий (слой persistence) возвращает данные сотрудника из нескольких частей в виде доменного объекта, его части как-то фильтруются перед показом юзеру, затем преобразуются с помощью Autofac в DTO и улетают выше — в вебсервис.

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

Я не думаю, что в разборе подобного кода есть какая-то большая алгоритмическая сложность, уж не хуже развесистого LINQ.

Можете починить?
Re: Resharper дико тормозит на файлах с LanguageExt
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 04.12.16 14:57
Оценка:
Здравствуйте, Слава, Вы писали:

С>В проекте используется LanguageExt.Core 1.9.2 (не спрашивайте меня — зачем оно, его туда уже притащили и с этим надо жить)

Спасибо, сделал реквест

С>Я не думаю, что в разборе подобного кода есть какая-то большая алгоритмическая сложность, уж не хуже развесистого LINQ.

Вообще-то есть, там везде generic-методы, для которых надо типы вывести.

С>Можете починить?

Будем стараться. Полный пример и снятый снепшот здорово бы помогли.
Re[2]: Resharper дико тормозит на файлах с LanguageExt
От: bnk СССР http://unmanagedvisio.com/
Дата: 04.12.16 16:25
Оценка:
Здравствуйте, 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
От: Слава  
Дата: 04.12.16 16:33
Оценка:
Здравствуйте, qxWork, Вы писали:

С>>Можете починить?

W>Будем стараться. Полный пример и снятый снепшот здорово бы помогли.

Я поинтересуюсь полным примером. Что вы подразумеваете под снепшотом, дамп процесса снять? Как вам его передать?
Re[3]: Resharper дико тормозит на файлах с LanguageExt
От: Слава  
Дата: 04.12.16 16:44
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Подобная же фигня с кодом, использующим библиотеку SPMeta2 (SharePoint)

bnk>Структура кода — примерно тот же дурдом, что показан выше, => xxx.foo(yyy => yyy.boo (zzz => zzz.bar(... (стадо вложенных лямбд с шаблонными методами), только библиотека другая.
bnk>Блин, куда мир катится. Я уж начал надеяться что никогда больше не увижу ничего похожего на шаманство а-ля boost.

Изначально в проект это было притащено скальщиками, а потом, когда скальщики прекратили работу над проектом и вообще ушли из этой поганенькой конторы — было решено оставить подобный код в качестве индусозащитной меры. От архитектора-индуса это не спасает, но по крайней мере рядовых кодеров-индусов в бэкенде нет (они все в БД, хранимки в пять экранов пишут... )
Re[3]: Resharper дико тормозит на файлах с LanguageExt
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 04.12.16 17:04
Оценка:
Здравствуйте, Слава, Вы писали:

С>Я поинтересуюсь полным примером. Что вы подразумеваете под снепшотом, дамп процесса снять? Как вам его передать?

NDA подпишем, если надо.
Вот инструкция.
Можно стукнуться ко мне в скайп sergey.coox — помогу снять, могу сразу посмотреть на происходящее, если исходники показывать другим людям можно.
Re[4]: Resharper дико тормозит на файлах с LanguageExt
От: bnk СССР http://unmanagedvisio.com/
Дата: 04.12.16 20:14
Оценка:
Здравствуйте, Слава, Вы писали:

bnk>>Блин, куда мир катится. Я уж начал надеяться что никогда больше не увижу ничего похожего на шаманство а-ля boost.


С>Изначально в проект это было притащено скальщиками, а потом, когда скальщики прекратили работу над проектом и вообще ушли из этой поганенькой конторы — было решено оставить подобный код в качестве индусозащитной меры. От архитектора-индуса это не спасает, но по крайней мере рядовых кодеров-индусов в бэкенде нет (они все в БД, хранимки в пять экранов пишут... )


Вообще мысль. Может к нам в текущий проект такое г. протащить, в качестве индусозащиты. Неплохое словечко кстати
Выглядит достаточно злым, думаю такого количества стрелочек и уголков хватит, чтобы обезвредить по крайней половину наших индусов.
Re: Resharper дико тормозит на файлах с LanguageExt
От: ollka Россия  
Дата: 15.12.16 19:32
Оценка:
Слава, здравствуйте!

Алгоритмически это самый сложный и дорогой для Overload resolution алгоритма пример. Гораздо дороже любого LINQ. И студия (точнее Roslyn) тоже страдает, просто делает это аккуратнее по отношению к работе в background потоках (то есть менее заметно для пользователя). Можете отключить ReSharper, например, выделить кусочек кода и вырезать его через ctr-x — у меня затыкается надолго.

Сложность во вложенных друг в друга лямбдах, при том, что каждая из них завернута в вызов метода с перегрузками. Каждая перегрузка это точка ветвления: предположим она подойдет, что тогда будет с кодом, который внутри лямбды. Сами можете оценить дерево ветвления и его глубину. Там есть, конечно, еще нюансы и оптимизации, которые могут сильно помочь в каких-то других случаях — но в данном нет. Он самый суровый.

Что мы можем сделать — это поработать над отзывчивостью. Тут есть что улучшать и куда копать. Но по сути разогнать алгоритм Overload resolution здесь не слишком реалистично.
Re[2]: Resharper дико тормозит на файлах с LanguageExt
От: Слава  
Дата: 15.12.16 19:51
Оценка:
Здравствуйте, 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.

  Пример LINQ, приводившего R# в ступор
            var sales = salesInfo.GroupBy(f => f.FuelName, (fuelKey, fuelData) =>
                new
                {
                    Fuel = fuelKey,
                    Volume = fuelData.Sum(x => x.FuelVolume),
                    Summ = fuelData.Sum(x => x.MoneySumm),
                    Weight = fuelData.Sum(x => x.Weight),
                    SubgroupPayment = fuelData.GroupBy(pay => pay.PaymentMethod, (paymentKey, paymentData) =>
                    new
                    {
                        PaymentMethod = paymentKey,
                        SubgroupPriceing = paymentData.GroupBy(priceing => priceing.Priceing, (priceingKey, priceingData) =>
                        new
                        {
                            PriceingName = priceingKey,
                            SubgroupPrice = priceingData.GroupBy(price => price.Price, (priceKey, priceData) =>
                            new
                            {
                                Price = priceKey,
                                Volume = priceData.Sum(x => x.FuelVolume),
                                Summ = priceData.Sum(x => x.MoneySumm),
                                Weight = priceData.Sum(x => x.Weight)
                            })
                        })
                    }
                    )
                }
                ).OrderBy(x => x.Fuel).ToList();


  salesInfo
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; }
    }
}
Отредактировано 15.12.2016 20:17 Слава . Предыдущая версия . Еще …
Отредактировано 15.12.2016 20:16 Слава . Предыдущая версия .
Re[3]: Resharper дико тормозит на файлах с LanguageExt
От: ollka Россия  
Дата: 16.12.16 08:44
Оценка:
На всякий случай еще добавлю. Для решения проблемы алгоритмической сложности достаточно по возможности выносить подвыражения в отдельные типизированные переменные. Ветвления начинаются именно когда аргументом вызова метода является лямбда.

Про прокрутку. У меня вот с ней не воспроизвелась проблема, даже если этот код раскопировать на 5 методов. Может быть снэпшот сможете снять (подскажу как) или солюшен прислать (под NDA)? У меня Решарпер затыкается на явных действиях (вызов квик фиксов) итп — тут понятно что можно сделать, но просто тайпить или читать код не мешает. Студия иногда выкидывает окно с заголовком Copy и висит прямо по ходу редактирования, но это Микрософт.
Re[4]: Resharper дико тормозит на файлах с LanguageExt
От: ollka Россия  
Дата: 16.12.16 12:05
Оценка:
Вот тут по профиляции инструкции. В идеале можно снять Timeline снэпшот — по нему сразу будет видно, кто нагружает UI поток лишней деятельностью.
https://confluence.jetbrains.com/display/ReSharper/ReSharper+Profiling+Instructions
Re: Resharper дико тормозит на файлах с LanguageExt
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 09.08.17 14:40
Оценка:
Здравствуйте, Слава, Вы писали:

С>Visual Studio Enterprise 2015 update 3 (14.0.25431.1), Resharper Ultimate 2016.2.2

В ЕАР 2017.2 должно стать намного лучше. Билд можно взять на пробу отсюда
Заранее спасибо
Re[2]: Resharper дико тормозит на файлах с LanguageExt
От: Слава  
Дата: 14.08.17 14:15
Оценка:
Здравствуйте, qxWork, Вы писали:

W>В ЕАР 2017.2 должно стать намного лучше. Билд можно взять на пробу отсюда

W>Заранее спасибо

Здравствуйте!

С новым решарпером студия действительно стала намного меньше тормозить. Однако появились не встречавшиеся раньше проблемы — например, подсказки в object initializer не сразу срабатывают, часть полей видна сразу, часть нужно как бы "выпрашивать" через многократное нажатие ctrl-space. И решарпер время от времени ловит какие-то исключения внутре самого себя.
Re[3]: Resharper дико тормозит на файлах с LanguageExt
От: _NN_  
Дата: 15.08.17 05:10
Оценка:
Здравствуйте, Слава, Вы писали:

С>Здравствуйте, qxWork, Вы писали:


W>>В ЕАР 2017.2 должно стать намного лучше. Билд можно взять на пробу отсюда

W>>Заранее спасибо

С>Здравствуйте!


С>С новым решарпером студия действительно стала намного меньше тормозить. Однако появились не встречавшиеся раньше проблемы — например, подсказки в object initializer не сразу срабатывают, часть полей видна сразу, часть нужно как бы "выпрашивать" через многократное нажатие ctrl-space. И решарпер время от времени ловит какие-то исключения внутре самого себя.


Кэш решарпера чистить пробовали ?
Ну так это же предварительная версия, а не релиз
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Resharper дико тормозит на файлах с LanguageExt
От: Слава  
Дата: 15.08.17 05:51
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Кэш решарпера чистить пробовали ?

Не пробовал, посмотрю.

_NN>Ну так это же предварительная версия, а не релиз


Мне стоило дописать, что работе эти недостатки в общем-то не мешают. Так что всё отлично, вы сделали то, что надо.
Re[4]: Resharper дико тормозит на файлах с LanguageExt
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 15.08.17 17:51
Оценка:
Здравствуйте, _NN_, Вы писали:

С>>С новым решарпером студия действительно стала намного меньше тормозить.

Это радует.

С>>Однако появились не встречавшиеся раньше проблемы — например, подсказки в object initializer не сразу срабатывают, часть полей видна сразу, часть нужно как бы "выпрашивать" через многократное нажатие ctrl-space. И решарпер время от времени ловит какие-то исключения внутре самого себя.


Ну исключения внутри себя — это нормально — парсер исторически на них написан.
А вот подсказки... Я правильно понимаю, что речь о полях и свойствах, которые в интеллисенс (он же code completion) не сразу появляются?
Re[5]: Resharper дико тормозит на файлах с LanguageExt
От: Слава  
Дата: 15.08.17 17:59
Оценка:
Здравствуйте, qxWork, Вы писали:

Вы не мне ответили.

W>Ну исключения внутри себя — это нормально — парсер исторически на них написан.

W>А вот подсказки... Я правильно понимаю, что речь о полях и свойствах, которые в интеллисенс (он же code completion) не сразу появляются?

Да, именно они появляются не сразу, то есть например у класса 8 свойств, в подсказке будет только 4, через некоторое время остальные подтягиваются. Возможно это связано с тем, что если класс свежесозданный, меньше минуты назад, то решарпер просто не успевает его целиком "заглотить и прожевать".
Re[6]: Resharper дико тормозит на файлах с LanguageExt
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 15.08.17 18:40
Оценка:
Здравствуйте, Слава, Вы писали:

С>Да, именно они появляются не сразу, то есть например у класса 8 свойств, в подсказке будет только 4, через некоторое время остальные подтягиваются. Возможно это связано с тем, что если класс свежесозданный, меньше минуты назад, то решарпер просто не успевает его целиком "заглотить и прожевать".

Хм, прям очень интересно.
Если воспроизводится, было бы чудесно получить performance snapshot. Начать профиляцию, вызвать комплишен, дождаться пока все свойства появятся и снять снепшот.
Заранее спасибо.
Re[3]: Resharper дико тормозит на файлах с LanguageExt
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 21.08.17 18:40
Оценка:
Здравствуйте, Слава, Вы писали:

С>С новым решарпером студия действительно стала намного меньше тормозить.


Зато умирает по 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>>
AVK Blog
Re[4]: Resharper дико тормозит на файлах с LanguageExt
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 22.08.17 04:56
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Зато умирает по Ctrl-Q. При этом содержимое тултипа она таки успевает показать, а вот на отрисовке рамки тултипа все умирает. Воспроизводится на 15.2, 15.3, 2017.1.3, 2017.2 последний

Какой-то конкретный пример? Или всегда?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.