ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π² .NET Core

ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ! Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Π΅ ΡΠ±ΠΎΡΠ½ΠΈΠΊ ΠΎΡ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π°Π· ΠΈ ΠΌΠΎΠΈΡΠ΅ ΠΊΠΎΠ»Π΅Π³ΠΈ ΠΏΡΠΈΠ»Π°Π³Π°ΠΌΠ΅ ΠΎΡ Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ.
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ°, Π½Π° ΠΊΠΎΡΡΠΎ ΡΠ° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½ΠΈ ΠΏΡΠ΅ΡΠΌΡΡΠ°Π½ΠΈΡΡΠ°:BenchmarkDotNet=v0.11.5, ΠΠ‘=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 ΡΡΠ΅ΡΡ ToArray ΠΈ ΡΠΈΠΊΠ»ΠΈ
ΠΠ»Π°Π½ΠΈΡΠ°Ρ
Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²Ρ ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΡΡ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ΡΠΎ Π½Π° .NET Core 3.0, Π½ΠΎ ΠΌΠ΅ ΠΈΠ·ΠΏΡΠ΅Π²Π°ΡΠΈΡ
Π°, Π½Π΅ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΠΊΡΠ°Π΄Π° ΡΡΠΆΠ΄Π° ΡΠ»Π°Π²Π° ΠΈ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌ ΡΡΠΆΠ΄Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π·Π°ΡΠΎΠ²Π° ΠΏΡΠΎΡΡΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΡΠ° .
ΠΡ ΡΠ΅Π±Π΅ ΡΠΈ ΡΠ°ΠΌΠΎ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½ΠΈΡΡΠ° ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΡΠΈ, Π΄ΠΎΠ±Π°Π²ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΠΈΠΊΠ»ΠΈ Π·Π° Π»ΡΠ±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° βC++ ΡΡΠΈΠ»β Π½Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΠΊΠ»ΠΈ.
ΠΠΎΠ΄:
public class Bench
{
private List<int> _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 < _list.Count; i++)
{
total += _list[i];
}
return total;
}
[Benchmark]
public int ForListFromEnd()
{
int total = 0;t
for (int i = _list.Count-1; 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 < _array.Length; i++)
{
total += _array[i];
}
return total;
}
[Benchmark]
public int ForArrayFromEnd()
{
int total = 0;
for (int i = _array.Length-1; i > 0; i--)
{
total += _array[i];
}
return total;
}
}
Π‘ΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π² .NET Core 2.2 ΠΈ 3.0 Π΅ ΠΏΠΎΡΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Π°. ΠΡΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΠΏΡΡ Π΄Π° ΠΏΠΎΠ»ΡΡΠ° Π² .NET Core 3.0:


ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΊΠ»ΡΡΠΈΠΌ, ΡΠ΅ ΡΠΈΠΊΠ»ΠΈΡΠ½Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ ΠΎΡ ΡΠΈΠΏ Array Π΅ ΠΏΠΎ-Π±ΡΡΠ·Π° Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡΡΡΠ΅ΡΠ½ΠΈΡΠ΅ ΡΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΡΠ½ΠΎΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π½Π΅ Π±ΠΈΠ²Π° Π΄Π° Π·Π°Π±ΡΠ°Π²ΡΠΌΠ΅, ΡΠ΅ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡΡΠ° ΡΠΈΠΏ List ΠΈΠΌΠ° ΡΠ²ΠΎΠΈ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠ°ΡΠ° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ. ΠΠΎΡΠΈ ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΈΡΠ΅ΡΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΠΈΠΊΠ»ΠΈΡΠ΅, Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅, ΡΠ΅ ΡΠΎΠ²Π° Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ loop ΠΈ ΡΡΡΠΎ Π΅ ΠΏΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ. ΠΠ° habr ΠΎΡΠ΄Π°Π²Π½Π° ΠΈΠ·Π»Π΅Π·Π΅ ΡΡΠ°ΡΠΈΡ: . Π’Ρ Π²ΡΠ΅ ΠΎΡΠ΅ Π΅ Π°ΠΊΡΡΠ°Π»Π½Π° ΠΈ ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° Π·Π° ΡΠ΅ΡΠ΅Π½Π΅.
Throw
ΠΡΠ΅Π΄ΠΈ Π³ΠΎΠ΄ΠΈΠ½Π° ΡΠ°Π±ΠΎΡΠ΅Ρ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ Π²ΡΡΡ Ρ legacy ΠΏΡΠΎΠ΅ΠΊΡ. Π ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΠΎΠ»Π΅ΡΠ° ΡΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡΡΠ° 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
Π ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° 5-Π³ΠΎΠ΄ΠΈΡΠ½ΠΈΡ ΡΠΈ ΠΎΠΏΠΈΡ Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° .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 Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΡΡΠ΅ΠΏΠ΅Π½Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π°ΠΌΠ°Π»ΡΠ²Π° ΠΈ Π±ΡΠ³ΠΎΠ²Π΅ΡΠ΅, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΡΠ° ΠΏΠΎΠΏΡΠ°Π²Π΅Π½ΠΈ. ΠΡΠ΅Π΄ΠΈ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π²ΠΎΠ΄Π΅ΡΠ΅ Π΄ΠΎ Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΏΡΡΠ²ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ Π² ASP.NET Core ΠΈ Π΄ΠΎ Π·Π°Π±Π°Π²ΡΠ½ΠΈΡ ΠΏΡΠΈ ΠΏΡΡΠ²Π°ΡΠ° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΡΡΠ΅ΠΏΠ΅Π½Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π² .NET Core 3.0 ΡΡ Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½Π° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Ρ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΏΠΎ Π²Π°ΡΠ΅ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅. ΠΠΊΠΎ ΡΡΠ΅ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡ team-lead, senior, middle ΠΈΠ»ΠΈ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅Π» Π½Π° ΠΎΡΠ΄Π΅Π», ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅, ΡΠ΅ Π±ΡΡΠ·Π°ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΡΠ΅Π½Π½ΠΎΡΡΡΠ° Π½Π° Π΅ΠΊΠΈΠΏΠ° ΠΈ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ ΡΠ΅ Π²ΠΈ ΡΠΏΠ΅ΡΡΠΈ Π²ΡΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΡΠΎ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅, ΡΠ°ΠΊΠ° ΠΈ Π·Π° ΡΠ°ΠΌΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
.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
