рдЗрд╕ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдиреЛрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ рд▓реАрдб рдбреЗрд╡рд▓рдкрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХрдИ рд╣рд╛рд▓рд┐рдпрд╛ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреБрдЫ рдЖрд╡реЗрджрдХ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд╛рдХрд┐рдл рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрдВрддреНрд░ рд╣реИ, рд╢рдмреНрджрдХреЛрд╢ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рднреА рдмрд╣реБрдд рдХрдЯреНрдЯрд░рдкрдВрдереА рд░рд╛рдп рдореЗрдВ рдЖрдпрд╛: рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╢рдмреНрджрдХреЛрд╢ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЬрдм рдЗрд╕реЗ рддреБрд░рдВрдд рдмрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ (LOH) рдХреЗ рдвреЗрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ LINQ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред !
рдмреЗрд╢рдХ, рдпреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЪ рдмрдпрд╛рди рдирд╣реАрдВ рд╣реИрдВред рдПрдХ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╢рдмреНрджрдХреЛрд╖ рдмрд╣реБрдд рдмрд╛рд░ рдЕрддреНрдпрдзрд┐рдХ рд▓реЛрдб рдХреЛрдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рджреЛрдиреЛрдВ рдХреА рдорд╛рдВрдЧ рдореЗрдВ рд╣реИред рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╢рдмреНрджрдХреЛрд╢ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ, рдпрд╣ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХрд┐рддрдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИ, рдпрд╣ рдХрд┐рддрдиреЗ "рдирд┐рд╢рд╛рди" рд╣реИ рдпрд╣ рдкреАрдврд╝рд┐рдпреЛрдВ рдФрд░ LOH рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдкрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рднрд╛рд░ рдкреИрджрд╛ рд╣реЛрдЧрд╛; рдЗрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдВрдЧреНрд░рд╣, рдЖрджрд┐ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореБрджреНрджреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред
Microsoft рд╕реЗ рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рдХреЛ рдкрддрд╛ рд╣реИ, рд╣реИрд╢ рдЯреЗрдмрд▓ рддрдВрддреНрд░ рдкрд░ред рдпрд╣ рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдирд┐рд░рдВрддрд░ рд╕реНрдерд┐рд░ рдЬрдЯрд┐рд▓рддрд╛ рдУ (1) рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ, рдЦреЛрдЬ рдХрд░рдиреЗ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИред рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ, рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реНрдореГрддрд┐ рдЦрдкрдд рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИред
рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдЖрдХрд╛рд░ рдХреЗ рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
int[] _buckets = new int[size];
Entry[] _entries = new Entry[size];
рдпреЗ рд╕рд░рдгрд┐рдпрд╛рдБ рдЙрдирдХреЗ рддреНрд╡рд░рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдбреЗрдЯрд╛ рдФрд░ рд╕реЗрд╡рд╛ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВред рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдПрдХ рдорд╛рд░реНрдЬрд┐рди рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡реЗ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЦрд╛рд▓реА рд╣реЛрддреЗ рд╣реИрдВред
рдПрдВрдЯреНрд░реА рд╣реЗрд▓реНрдкрд░ рдЗрдХрд╛рдИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реА рдХреЛ рд▓рдкреЗрдЯрддреА рд╣реИ, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рд╣реИ:
private struct Entry
{
public uint hashCode;
public int next;
public TKey key;
public TValue value;
}
, , , _entries. , ConcurrentDictionary, . ( 64 16 8 ) , .
_entries Dictionary 85000 LOH (, , 64 3372 , 1932). , , .
Microsoft _entries , Entry? LOH (, , ). , , .
, . 12 (4 _buckets 4 hashCode next Entry). , , , 12 . ? .
Dictionary . . Dictionary<int, int> ( ). , тАУ ( ). 500 . 13 . 500 .

, . , , , .
, _buckets _entries , ┬л┬╗, . LOH, .
, 746 3 .
, Dictionary . , , , .NET Core TrimExcess, .
:
- , EnsureCapacity. .
- , 400 10. (80 ). new Dictionary<int, int>(10001000), 190. , , .
- , Dictionary EnsureCapacity(capacity*), . , _buckets _entries . . , EnsureCapacity(0).
- , ( ) , , Dictionary: . , . , ( ).
- TrimExcess. LOH . .
Dictionary. , Dictionary<Key, Value>, :
public class Key
{
public int Item { get; set; }
public Key(int item)
{
Item = item;
}
public override bool Equals(object obj)
{
return Item.Equals(obj);
}
public override int GetHashCode()
{
return Item.GetHashCode();
}
}
public class Value
{
public int Item { get; set; }
public Value(int item)
{
Item = item;
}
}
.

?
:
- 64 (8 ) (8 ).
- , , 8 ┬л┬╗ .
- Item Key Value 8 , , Item 4 .
20 76 .
:
, . ? , ( 10-20-30 ) . ?
. , Dictionary<int, int>(int count) :
struct Entry<TValue>
{
public int[] Keys;
public TValue[] Values;
public Entry(int count)
{
Keys = new int[count];
Values = new TValue[count];
}
public bool TryGetValue(int key, out TValue value)
{
for (int j = 0; j < Keys.Length; ++j)
{
if (Keys[j] == key)
{
value = Values[j];
return true;
}
}
value = default(TValue);
return false;
}
}
count тАУ -, .
.

, 18 count=10 134 count=190 ( 50 . ). ( тАУ 29 ), ( 150) , (, ).
, (, , Entry , ).
, (callvirt GetHashCode Equals). тАУ . , , , (generic) . .
SortedList<int, int>.
.

, .
: , . .
рдкреНрд░рд╕реНрддреБрдд рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЫреЛрдЯреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╕реЗрд╡рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрдзрд┐рдХ рд╣реИред
рдЯреЗрд╕реНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред