Информация об изменениях

Сообщение Re[2]: Resharper дико тормозит на файлах с LanguageExt от 15.12.2016 19:51

Изменено 15.12.2016 20:17 Слава

Здравствуйте, 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();

[cut=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; }
    }
}
[/cut]
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.

  Пример 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; }
    }
}