LINQ рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рд╢рдмреНрдж рдХрд╣реЗ

рдПрдХ c # рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░рд╛ рд╕рд╛рд░рд╛ рдЬреАрд╡рди, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ LINQ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╡рд╣ рдХрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ, рди рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдХреЛрдб рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреЛрдиреЛрдВ рдХреА рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдмрд╛рдзрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЕрдХреНрд╕рд░ var groupedByDate = lst.GroupBy(item => item.IssueTime.Date).Select(тАж).ToList()рдиреБрдХрд╕рд╛рди рдпрд╛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЗрд░рд╛рджреЗ рдХреЗ рдХрд╛рд░рдг рдРрд╕рд╛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдФрд░ рдХрд░рддрд╛ рд╣реВрдВ , рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЪрд░ рдХреЗ рдкрд╛рда рдкрд░ рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рд░рдЦреЗрдВ рдФрд░ рдЖрдк рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреБрдЫ рд╣реИ рдпрд╛ рдирд╣реАрдВред


рд╢реБрд░реВ


" рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд▓реЗрдЦ " рдФрд░ "рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЧрд▓рдд рд╣реИ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж , рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдХреНрдпрд╛ "рдореИрдиреБрдЕрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХреЛрдб" рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП "LINQ" рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ LINQ рдХреНрдпреЛрдВ? рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ, рдореИрдВ рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ LINQ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ LINQ рдХреЛ рдПрдВрдЯрд┐рдЯреАрдЬ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред LINQ to Entities рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдореЗрд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди SQL рдХреНрд╡реЗрд░реА рдХрд┐рддрдиреА рдЗрд╖реНрдЯрддрдо рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рдХрд┐рддрдиреА рдЬрд▓реНрджреА рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред


рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рдПрдХ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ integerList.Where(item => item > 5).Sum()"рдореИрдиреНрдпреБрдЕрд▓" рдХреЛрдб рд╡рд╛рд▓реЗ рдХреЛрдб рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ foreach, ifрдФрд░ рдЗрд╕реА рддрд░рд╣, рд▓реЗрдЦ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рд░реЛрдЪрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЧрд╛ред


рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдореИрдВрдиреЗ рдХреА рдереА, рд╡рд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛рддреНрдордХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдореЗрдВ, рд▓реЗрдХрд┐рди рдЕрдВрдЧреВрдареА рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛрдиреЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд, рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ variable0.Equals(constant0, StringComparison.InvariantCultureIgnoreCase)рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ variable0.ToUpperInvariant() ==constant0.ToUpperInvariant()ред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рд░рдВрддрд░ рдХреЗ рд▓рд┐рдП рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдЕрдкрд░рдХреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рдореИрдВрдиреЗ рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ variable0.ToUpperInvariant() ==constant0InUpperCaseInvariantред


рддрдм рд╕рднреА рдХреЛрдб рдЬреЛ рд╕реАрдзреЗ LINQ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдореИрдиреБрдЕрд▓ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рдереЗ, рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрдХрдбрд╝рд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдХреЛрдб рдерд╛ рдЬреЛ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ Mock<HabraDbContext>ред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд░реЗ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


IStorage _db;

[GlobalSetup]
public void Setup()
{
    _db = MockHelper.InstanceDb();
}

private IStorage DBInstance => _db;

тАж тАФ , ! Linq ┬л┬╗ !


рдЫрд╡рд┐


┬л - ┬╗ . LINQ . , тАФ .



, , LINQ vs ┬л┬╗ . . . .


, , , ([Params(1, 10, 100, 1000)]). . . . StatisticColumnRelStdDev.


тАФ FastHydrationLinq, ManualHydrationLinq тАФ . , , (Fast)(Manual)(Slow)HydrationLinq vs (Fast)(Manual)(Slow)Hydration, ManualHydrationLinq. FastHydrationLinq - . .


ToArray, ToDictionary IEnumerable<T> . , FastContactHydrator2. - Action<Contact, string> c ConcurrentDictionary<string, Action<Contact, string>> IEnumerable<KeyValuePair<string, Action<Contact, string>>>. GetContact2, Sum, .


protected override Contact GetContact2(IEnumerable<PropertyToValueCorrelation> correlations)
{
    var contact = new Contact();
    int dummySum = _propertySettersArray.Join(correlations, propItem => propItem.Key, corrItem => corrItem.PropertyName, (prop, corr) => { prop.Value(contact, corr.Value); return 1; }).Sum();
    return contact;
}

ParseWithLinq


public static IEnumerable<KeyValuePair<string, string>> ParseWithLinq2(string rawData, string keyValueDelimiter = ":", string pairDelimiter = ";")
    => rawData.Split(pairDelimiter)
    .Select(x => x.Split(keyValueDelimiter, StringSplitOptions.RemoveEmptyEntries))
    .Select(x => x.Length == 2 ? new KeyValuePair<string, string>(x[0].Trim(), x[1].Trim())
                                : new KeyValuePair<string, string>(_unrecognizedKey, x[0].Trim()));

.


FastContactHydrator2, , , , -, ( ParseWithLinq ParseWithoutLinq). . , , ToArray. 10 var result = new List<PropertyToValueCorrelation>(10). 10? 42 , 10 . Fair .


. . GetFakeData . , .
, , ┬л ┬╗ (RelStdDev). N=1000.


:


-  `ManualHydration`, `SlowHydration`, `FastHydration`, `ManualHydrationLinq`, `SlowHydrationLinq`, `FastHydrationLinq` -     ,  ;

  • ManualHydrationFair, ManualHydrationFairLinq, FastHydrationFairLinq тАФ , ;
  • FastHydrationLinq2 тАФ , , - , LINQ;
  • N , ;
  • Ratio FastHydrationLinq2.

рдЫрд╡рд┐
Linq-


? тАФ FastHydrationLinq2 ManualHydrationLinq Ratio. 26,361.37 ╬╝s 26,422.17 ╬╝s N=1000. / N. ManualHydrationFairLinq, 8% , . FastHydrationFairLinq, 1% -.


Fair-. , ManualHydrationFairLinq 8% . FastHydrationFairLinq FastHydrationLinq 12%. Linq .


, . . , MockHelper.InstanceDb() Setup, . тАФ , GetFakeData, . , тАФ . MockHelper.InstanceDb() .


N, MakeGarbage. False , True тАФ .


рдЫрд╡рд┐


N

image


Voil├а, , . тАФ N=1. 10% 82% .


тАж .



, , ┬л┬╗ тАФ Linq-, :


рдЫрд╡рд┐
N=1 MakeGarbage=True ┬л┬╗


, , , LINQ .
┬лGen X┬╗ ┬лAllocated┬╗ N=1 MakeGarbage=True o , FastHydrationLinq2


|                                |      Gen 0 |   Gen 1 | Gen 2 |   Allocated |
|┬л┬╗     |    20.5078 |  0.4883 |     - |    63.95 KB |
|Linq-        |    20.7520 |       - |     - |    63.69 KB |

ManualHydrationFairLinq .


. , , тАФ .
, ? . , N [Params(1, 100)] MakeGargabe=True. ┬л┬╗ тАФ Linq-, . тАФ , тАФ Linq-, Linq тАФ тАФ тАФ Linq. тАФ . .


, , тАФ Linq- . , . paint.net, . paint.net тАФ paint.net . paint.net тАФ ┬л┬╗ , тАФ Linq- .


тАФ N 1, 10, 100, 1000 MakeGarbage [ParamsAllValues]. paint.net, тАФ ┬л┬╗ . тАФ Linq- . paint.net Visual Studio тАФ ┬л┬╗ . , 80- . , Linq- 2%.



рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, LINQ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рд░рд╛рдп рдирд╣реАрдВ рдмрджрд▓реА рд╣реИ - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЗрдЦрди рдХреЛрдб рдореЗрдВ рдореЗрд░реА рдЙрддреНрдкрд╛рджрдХрддрд╛ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рд╣реИ; LINQ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдареАрдХ рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ LINQ рдХреЛрдб рдХреЗ рд╡рд┐рд▓рдВрдмрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред


рдпрджрд┐ рдХрд┐рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ - .net рдЬрдиреНрдо рдХреА рдЪреЛрдЯ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рдЪреБрдирдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдерд╛ред


рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред


All Articles