Performance in .NET Core

ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ! Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Π΅ ΡΠ±ΠΎΡΠ½ΠΈΠΊ Ρ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π°Π· ΠΈ ΠΌΠΎΠΈΡΠ΅ ΠΊΠΎΠ»Π΅Π³ΠΈ ΠΏΡΠΈΠ»Π°Π³Π°ΠΌΠ΅ ΠΎΡ Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ.
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ°, Π½Π° ΠΊΠΎΡΡΠΎ ΡΠ° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡΡΠ°:BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R), 1 CPU, 8 Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΈ 4 ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄ΡΠ°
.NET Core SDK=3.0.100
[Host]: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit RyuJIT
Core: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit RyuJIT
[Host]: .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
Core: .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
Job=Core Runtime=Core
ToList vs ToArray ΠΈ ΡΠΈΠΊΠ»ΠΈ
ΠΠ»Π°Π½ΠΈΡΠ°Ρ
Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²Ρ ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Ρ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ΡΠΎ Π½Π° .NET Core 3.0, Π½ΠΎ ΠΌΠ΅ ΠΈΠ·ΠΏΡΠ΅Π²Π°ΡΠΈΡ
Π°, Π½Π΅ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΠΊΡΠ°Π΄Π° ΡΠ»Π°Π²Π°ΡΠ° Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΈ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌ ΡΡΠΆΠ΄Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π·Π°ΡΠΎΠ²Π° ΠΏΡΠΎΡΡΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΡΠ° .
ΠΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΠΈΡΠΊΠ°ΠΌ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ ΠΌΠΎΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ, Π΄ΠΎΠ±Π°Π²ΠΈΡ Π² ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΈΡΠ΅ ΡΠΈΠΊΠ»ΠΈ Π·Π° ΠΏΠΎΡΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° "C++ ΡΡΠΈΠ»" Π½Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΠΈΠΊΠ»ΠΈ.
ΠΠΎΠ΄:
public class Bench
{
private List _list;
private int[] _array;
[Params(100000, 10000000)] public int N;
[GlobalSetup]
public void Setup()
{
const int MIN = 1;
const int MAX = 10;
Random random = new Random();
_list = Enumerable.Repeat(0, N).Select(i => random.Next(MIN, MAX)).ToList();
_array = _list.ToArray();
}
[Benchmark]
public int ForList()
{
int total = 0;
for (int i = 0; i 0; i--)
{
total += _list[i];
}
return total;
}
[Benchmark]
public int ForeachList()
{
int total = 0;
foreach (int i in _list)
{
total += i;
}
return total;
}
[Benchmark]
public int ForeachArray()
{
int total = 0;
foreach (int i in _array)
{
total += i;
}
return total;
}
[Benchmark]
public int ForArray()
{
int total = 0;
for (int i = 0; i 0; i--)
{
total += _array[i];
}
return total;
}
}
Π‘ΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π² .NET Core 2.2 ΠΈ 3.0 Π΅ ΠΏΠΎΡΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Π°. ΠΡΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΠΏΡΡ Π΄Π° ΠΏΠΎΠ»ΡΡΠ° Π² .NET Core 3.0:


ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΊΠ»ΡΡΠΈΠΌ, ΡΠ΅ ΡΠΈΠΊΠ»ΠΈΡΠ½Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ ΠΎΡ ΡΠΈΠΏ Array Π΅ ΠΏΠΎ-Π±ΡΡΠ·Π°, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡΡΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠ²Π½ΠΎΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΠ΅ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡΡΠ° ΠΎΡ ΡΠΈΠΏ List ΠΈΠΌΠ° ΡΠ²ΠΎΠΈ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΈ Π΅ Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠ°ΡΠ° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ. ΠΠΎΡΠΈ Π°ΠΊΠΎ ΠΏΠΈΡΠ΅ΡΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΈΠΊΠ»ΠΈ, Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅, ΡΠ΅ ΡΠΎΠ²Π° Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ loop ΠΈ ΡΠΎΠΉ ΡΡΡΠΎ Π΅ ΠΏΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ Π½Π° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠΈΠΊΠ»ΠΈ. ΠΠ° habr ΠΎΡΠ΄Π°Π²Π½Π° ΠΈΠ·Π»Π΅Π·Π΅ ΡΡΠ°ΡΠΈΡ: . Π’Ρ Π²ΡΠ΅ ΠΎΡΠ΅ Π΅ Π°ΠΊΡΡΠ°Π»Π½Π° ΠΈ ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° Π·Π° ΠΏΡΠΎΡΠΈΡ.
Throw
ΠΡΠ΅Π΄ΠΈ Π³ΠΎΠ΄ΠΈΠ½Π° ΡΠ°Π±ΠΎΡΠ΅Ρ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡ Ρ Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎ, Π² ΠΊΠΎΠΉΡΠΎ Π±Π΅ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π²Π°Π»ΠΈΠ΄ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ»Π΅ΡΠ° ΡΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡΡΠ° try-catch-throw. Π’ΠΎΠ³Π°Π²Π° Π²Π΅ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°Ρ , ΡΠ΅ ΡΠΎΠ²Π° Π΅ Π½Π΅Π·Π΄ΡΠ°Π²ΠΎΡΠ»ΠΎΠ²Π½Π° Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π·Π°ΡΠΎΠ²Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°Ρ Π΄Π° Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ. ΠΠΎ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π·Π°ΡΠΎ Π΅ Π»ΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ Π³ΡΠ΅ΡΠΊΠΈ Ρ ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ. ΠΠ°ΠΏΠΈΡΠ°Ρ ΠΌΠ°Π»ΡΠΊ ΠΊΠΎΠ΄, Π·Π° Π΄Π° ΡΡΠ°Π²Π½Ρ Π΄Π²Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΈ ΠΈΠ·ΠΌΠ΅ΡΠΈΡ "Π±Π΅Π½Ρ" Π½Π° Π²ΡΠ΅ΠΊΠΈ Π²Π°ΡΠΈΠ°Π½Ρ.
ΠΠΎΠ΄:
public bool ContainsHash()
{
bool result = false;
foreach (var file in _files)
{
var extension = Path.GetExtension(file);
if (_hash.Contains(extension))
result = true;
}
return result;
}
public bool ContainsHashTryCatch()
{
bool result = false;
try
{
foreach (var file in _files)
{
var extension = Path.GetExtension(file);
if (_hash.Contains(extension))
result = true;
}
if(!result)
throw new Exception("false");
}
catch (Exception e)
{
result = false;
}
return result;
}Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π² .NET Core 3.0 ΠΈ Core 2.2 ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ (.NET Core 3.0):


Try catch ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄Π° ΠΈ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π²Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°. ΠΠΎ Π°ΠΊΠΎ Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ° ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ, Π½Π΅ Π²ΠΌΡΠΊΠ²Π°ΠΉΡΠ΅ ΡΠ΅Π·ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΊΠΎΠ΄, ΠΎΡ ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ΅ ΠΎΡΠ°ΠΊΠ²Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π³ΡΠ΅ΡΠΊΠΈ β ΡΠΎΠ²Π° ΡΠ΅ ΡΠ»Π΅ΡΠ½ΠΈ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄Π°. ΠΡΡΡΠ½ΠΎΡΡ, ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π΅ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ Ρ
Π²ΡΡΠ»ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΌΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡΡΠ° throw new Exception.
Π₯Π²ΡΡΠ»ΡΠ½Π΅ΡΠΎ Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ-Π±Π°Π²Π½ΠΎ ΠΎΡ Π½ΡΠΊΠ°ΠΊΡΠ² ΠΊΠ»Π°Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ±Π΅ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ° Π² Π½ΡΠΆΠ½ΠΈΡ ΡΠΎΡΠΌΠ°Ρ. ΠΠΊΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΡΠ΅ ΡΠΎΡΠΌΠ° ΠΈΠ»ΠΈ Π½ΡΠΊΠ°ΠΊΠ²ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ²Π½ΠΎ Π·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊΠ²Π° Π³ΡΠ΅ΡΠΊΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅, Π·Π°ΡΠΎ Π½Π΅ Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΈΡΠ΅?
ΠΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ throw new Exception(), Π°ΠΊΠΎ ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ°ΡΠΈΡ Π½Π΅ Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½Π°. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΊΡΠΏΠΈ!!!
ToLower, ToLowerInvariant, ToUpper, ToUpperInvariant
ΠΡΠ΅Π· ΠΏΠ΅ΡΡΠ΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΎΠΏΠΈΡ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° .NET ΡΡΠΌ ΡΡΠ΅ΡΠ°Π» ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅. ΠΠΈΠ΄ΡΡ ΠΈ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π°: ΠΈΠΌΠ°ΡΠ΅ Π΅Π΄Π½ΠΎ Enterprise ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ°Π²Π΅ΡΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½. ΠΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ ΡΠ½ΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅? Π ΠΊΠ½ΠΈΠ³Π°ΡΠ° CLR via C# Π½Π° Π ΠΈΡ ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΡΡ ToUpperInvariant() Π΅ ΠΏΠΎ-Π±ΡΡΠ· ΠΎΡ ToLowerInvariant().
ΠΠ·Π²Π°Π΄ΠΊΠ° ΠΎΡ ΠΊΠ½ΠΈΠ³Π°ΡΠ°:

Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½Π΅ ΠΏΠΎΠ²ΡΡΠ²Π°Ρ
ΠΈ ΡΠ΅ΡΠΈΡ
Π΄Π° ΠΏΡΠΎΠ²Π΅Π΄Π° Π½ΡΠΊΠΎΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ Π½Π° .NET Framework ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΌΠ΅ ΡΠΎΠΊΠΈΡΠ° - Π½Π°Π΄ 15% ΠΏΠΎΠ²ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°. ΠΠ° ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΡΠΈΠ½ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎΠΊΠ°Π·Π°Ρ
Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ ΠΈ ΠΈΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡ
Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° 2 ΠΎΡ 14 ΠΏΡΠΎΠ΅ΠΊΡΠ° Π±ΡΡ
Π° ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ Π·Π° Π½ΠΎΠ²ΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½ΠΈΡ, Π° ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΡΠ΅Π·ΠΈ Π΄Π²Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π±ΡΡ
Π° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΠΈ Excel ΡΠ°Π±Π»ΠΈΡΠΈ, ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ Π±Π΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π·Π½Π°ΡΠΈΠΌ Π·Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠ°.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π²ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠΌ ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½ΠΈΡ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° .NET Core, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π²ΡΠ΅ΠΊΠΈ ΠΎΡ Π²Π°Ρ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΈΠ·Π±ΠΎΡ Π² ΠΏΠΎΡΠΎΠΊΠ° Π½Π° Π½Π°ΠΉ-ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. Π ΠΈΡΠΊΠ°ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²Ρ, ΡΠ΅ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ°Π±ΠΎΡΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ToUpper() Π·Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅.
ΠΠΎΠ΄:
public const string defaultString = "VXTDuob5YhummuDq1PPXOHE4PbrRjYfBjcHdFs8UcKSAHOCGievbUItWhU3ovCmRALgdZUG1CB0sQ4iMj8Z1ZfkML2owvfkOKxBCoFUAN4VLd4I8ietmlsS5PtdQEn6zEgy1uCVZXiXuubd0xM5ONVZBqDu6nOVq1GQloEjeRN8jXrj0MVUexB9aIECs7caKGddpuut3";
[Benchmark]
public bool ToLower()
{
return defaultString.ToLower() == defaultString.ToLower();
}
[Benchmark]
public bool ToLowerInvariant()
{
return defaultString.ToLowerInvariant() == defaultString.ToLowerInvariant();
}
[Benchmark]
public bool ToUpper()
{
return defaultString.ToUpper() == defaultString.ToUpper();
}
[Benchmark]
public bool ToUpperInvariant()
{
return defaultString.ToUpperInvariant() == defaultString.ToUpperInvariant();
}


Π .NET Core 3.0 ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΡΠ΅Π·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π΅ ΠΎΠΊΠΎΠ»ΠΎ x2 ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈΡΠ΅ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠΌ.


Tier Compilation
Π ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΠΈ ΡΡΠ°ΡΠΈΡ ΠΎΠΏΠΈΡΠ°Ρ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π±ΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΠΌ ΠΈ Π΄ΠΎΠΏΡΠ»Π½Ρ Π΄ΡΠΌΠΈΡΠ΅ ΡΠΈ. ΠΠ½ΠΎΠ³ΠΎΡΡΠΎΠ²Π½Π΅Π²Π°ΡΠ° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΡΡΠΊΠΎΡΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΠΆΠ΅ΡΡΠ²Π°ΡΠ΅ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΎΡ ΠΊΠΎΠ΄Π° Π²ΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈ Π² ΠΏΠΎ-ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° Π·Π°Π΄Π΅Π½ ΠΏΠ»Π°Π½, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΠΌΠ°Π»ΠΊΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½ΠΈ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ. Π‘ ΠΏΡΠΈΡΡΠΈΠ³Π°Π½Π΅ΡΠΎ Π½Π° .NET Core 3.0 Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΠ±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π° tier ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π°ΠΌΠ°Π»Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ Π±ΡΡ Π° ΠΏΠΎΠΏΡΠ°Π²Π΅Π½ΠΈ Π±ΡΠ³ΠΎΠ²Π΅, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ. ΠΠΎ-ΡΠ°Π½ΠΎ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π²ΠΎΠ΄Π΅ΡΠ΅ Π΄ΠΎ Π³ΡΠ΅ΡΠΊΠΈ Π² ΠΏΡΡΠ²ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ Π² ASP.NET Core ΠΈ Π΄ΠΎ Π·Π°Π±Π°Π²ΡΠ½Π΅ ΠΏΡΠΈ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½Π°ΡΠ° ΡΠ±ΠΎΡΠΊΠ° Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΡΡΠΎΠ²Π½Π΅Π²Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π² .NET Core 3.0 Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½Π° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Ρ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅ ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅. ΠΠΊΠΎ Π·Π°Π΅ΠΌΠ°ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π½Π° ΡΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅Π» Π½Π° Π΅ΠΊΠΈΠΏ, ΡΡΠ°ΡΡΠΈ ΠΈΠ»ΠΈ ΡΡΠ΅Π΄Π΅Π½ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡ ΠΈΠ»ΠΈ ΡΡΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅Π» Π½Π° ΠΎΡΠ΄Π΅Π», ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅, ΡΠ΅ Π±ΡΡΠ·ΠΎΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΡΠ΅Π½Π½ΠΎΡΡΡΠ° Π½Π° Π΅ΠΊΠΈΠΏΠ° ΠΈ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ ΡΠ΅ Π²ΠΈ ΡΠΏΠ΅ΡΡΠΈ Π²ΡΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΡΠΎ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅, ΡΠ°ΠΊΠ° ΠΈ ΡΠ°ΠΌΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
.NET Π½ΠΈΠ²ΠΎ Π½Π°Π³ΠΎΡΠ΅
ΠΠΎΠ²ΠΈΡΠ΅ΡΠ΅ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° Π²Π°ΡΠΈΡ .NET Framework / .NET Core. Π§Π΅ΡΡΠΎ Π²ΡΡΠΊΠ° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ ΡΡΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΈ Π΄ΠΎΠ±Π°Π²Ρ Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠΎ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠΎΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°? ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΡΡΡ :
- Π .NET Core 3.0 ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ Π° R2R ΠΎΠ±ΡΠ°Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½Π°ΠΌΠ°Π»ΡΡ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° .NET Core ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
- Π‘ Π²Π΅ΡΡΠΈΡ 2.2 ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Tier Compilation, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΈΡΠ΅ ΡΠ΅ ΠΎΡΠ΄Π΅Π»ΡΡ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
- ΠΠΎΠ΄ΠΊΡΠ΅ΠΏΠ° Π·Π° Π½ΠΎΠ²ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠΈ .NET Standard.
- ΠΠΎΠ΄ΠΊΡΠ΅ΠΏΠ° Π·Π° Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅.
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ: Ρ Π²ΡΡΠΊΠ° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π° Π² Π±Π°Π·ΠΎΠ²ΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Collection/Struct/Stream/String/Regex ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ. ΠΠΊΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΡΠ΅ ΠΎΡ .NET Framework Π½Π° .NET Core, ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π΅Π½ ΡΡΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π°ΠΏΡΠ°Π²ΠΎ ΠΎΡ ΠΊΡΡΠΈΡΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠΊΡΠ΅ΠΏΡΠΌ Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ ΡΠ°ΡΡ ΠΎΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈΡΠ΅, Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ Π² .NET Core 3.0:

ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠΈ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π½Π° Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Π·Π° ΠΏΠΎΡΡΠΈΠ³Π°Π½Π΅ Π½Π° ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ. Π©Π΅ ΡΠ΅ ΡΠ°Π΄Π²Π°ΠΌ, Π°ΠΊΠΎ ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π·Π½Π°Π½ΠΈΡΡΠ° ΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π² .NET.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
