ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π² .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
[Π₯ΠΎΡΡ]: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64-Π±ΠΈΡΠΎΠ² RyuJIT
Π―Π΄ΡΠΎ: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit RyuJIT
[Π₯ΠΎΡΡ]: .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64-Π±ΠΈΡΠΎΠ² RyuJIT
Π―Π΄ΡΠΎ: .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
Job=Core Runtime=Core
ToList ΡΡΠ΅ΡΡ ToArray ΠΈ Cycles
ΠΠ»Π°Π½ΠΈΡΠ°Ρ
Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²Ρ ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Ρ ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ Π½Π° .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:
ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΊΠ»ΡΡΠΈΠΌ, ΡΠ΅ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ ΠΎΡ ΠΌΠ°ΡΠΈΠ²ΠΈ Π΅ ΠΏΠΎ-Π±ΡΡΠ·Π° ΠΏΠΎΡΠ°Π΄ΠΈ Π½Π΅ΠΉΠ½ΠΈΡΠ΅ Π²ΡΡΡΠ΅ΡΠ½ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΈΠ·ΡΠΈΡΠ½ΠΎΡΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠΈ ΡΡΡΡΠ²Π° Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΠ΅ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡΡΠ° List ΠΈΠΌΠ° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ. ΠΠΎΡΠΈ ΠΈ Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΈΠΊΠ»ΠΈ, Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅, ΡΠ΅ ΡΠΎΠ²Π° Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΡΠΈΠΊΡΠ» ΠΈ ΡΡΡΠΎ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈ Π½Π° Π΅Π²Π΅Π½ΡΡΠ°Π»Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠΈΠΊΡΠ»Π°. ΠΡΠ΅Π΄ΠΈ Π΄ΠΎΡΡΠ° Π²ΡΠ΅ΠΌΠ΅ Π² habr Π±Π΅ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π° ΡΡΠ°ΡΠΈΡ:
Π₯Π²ΡΡΠ»ΡΠΌ
ΠΡΠ΅Π΄ΠΈ Π³ΠΎΠ΄ΠΈΠ½Π° ΡΠ°Π±ΠΎΡΠΈΡ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΏΠΎ Π½Π°ΡΠ»Π΅Π΄Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ, Π² ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ Π±Π΅ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π²Π°Π»ΠΈΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠ»Π΅ ΡΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ 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 ΡΠ΅ Π½Π°ΡΡΠΊΠ½Π°Ρ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅. ΠΠΈΠ΄ΡΡ ΠΈ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π°: ΠΈΠΌΠ°ΡΠ΅ Π΅Π΄Π½ΠΎ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½. ΠΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π΄ΠΈΠ½ΠΈ? Π ΠΊΠ½ΠΈΠ³Π°ΡΠ° CLR ΡΡΠ΅Π· C# ΠΎΡ Richter ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΡΡ 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 ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈΡΠ΅ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ.
ΠΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° Π½ΠΈΠ²ΠΎ
Π ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΠΈ ΡΡΠ°ΡΠΈΡ ΠΎΠΏΠΈΡΠ°Ρ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ, Π±ΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΠΌ ΠΈ Π΄ΠΎΠΏΡΠ»Π½Ρ Π΄ΡΠΌΠΈΡΠ΅ ΡΠΈ. ΠΠ½ΠΎΠ³ΠΎΡΡΠ΅ΠΏΠ΅Π½Π½Π°ΡΠ° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΡΡΠΊΠΎΡΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π½ΠΎ Π²ΠΈΠ΅ ΠΆΠ΅ΡΡΠ²Π°ΡΠ΅ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΎΡ ΠΊΠΎΠ΄Π° Π²ΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈ Π² ΠΏΠΎ-ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π° Π²Π΅ΡΡΠΈΡ Π²ΡΠ² ΡΠΎΠ½ΠΎΠ² ΡΠ΅ΠΆΠΈΠΌ, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΠΌΠ°Π»ΠΊΠΈ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ. Π‘ Π½Π°Π²Π»ΠΈΠ·Π°Π½Π΅ΡΠΎ Π½Π° NET Core 3.0, Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° Π½ΠΈΠ²Π° Π½Π°ΠΌΠ°Π»Ρ ΠΈ Π³ΡΠ΅ΡΠΊΠΈΡΠ΅, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, Π±ΡΡ Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½ΠΈ. ΠΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π³ΡΠ΅ΡΠΊΠΈ Π² ΠΏΡΡΠ²ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ Π² ASP.NET Core ΠΈ Π·Π°ΠΌΡΡΠ·Π²Π° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΡΠ²ΠΎΡΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΡΡΠ΅ΠΏΠ΅Π½Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π² .NET Core 3.0, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅, Π°ΠΊΠΎ ΠΆΠ΅Π»Π°Π΅ΡΠ΅. ΠΠΊΠΎ ΡΡΠ΅ Π² ΠΏΠΎΠ·ΠΈΡΠΈΡΡΠ° Π½Π° ΡΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅Π» Π½Π° Π΅ΠΊΠΈΠΏ, ΡΡΠ°ΡΡΠΈ, ΡΡΠ΅Π΄Π΅Π½ ΠΈΠ»ΠΈ ΡΡΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅Π» Π½Π° ΠΎΡΠ΄Π΅Π», ΡΠΎΠ³Π°Π²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅, ΡΠ΅ Π±ΡΡΠ·ΠΎΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° Π΅ΠΊΠΈΠΏΠ° ΠΈ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΡΠΏΠ΅ΡΡΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π½Π° Π΄Π²Π°ΠΌΠ°ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ ΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΌΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ.
.NET Π½ΠΈΠ²ΠΎ Π½Π°Π³ΠΎΡΠ΅
ΠΠ°Π΄ΡΡΡΠΎΠΉΡΠ΅ Π²Π°ΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° .NET Framework / .NET Core. Π§Π΅ΡΡΠΎ Π²ΡΡΠΊΠ° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΈ Π΄ΠΎΠ±Π°Π²Ρ Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠΎ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠΎΡΠ½ΠΎ ΡΠ° ΠΏΠΎΠ»Π·ΠΈΡΠ΅? ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΡΡΡ :
- .NET Core 3.0 ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈ R2R ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½Π°ΠΌΠ°Π»ΡΡ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° .NET Core ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
- Π‘ Π²Π΅ΡΡΠΈΡ 2.2 ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Tier Compilation, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΈΡΠ΅ ΡΠ΅ ΠΎΡΠ΄Π΅Π»ΡΡ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π½ΠΎΠ²ΠΈ .NET ΡΡΠ°Π½Π΄Π°ΡΡΠΈ.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅.
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ, Ρ Π²ΡΡΠΊΠ° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π±Π°Π·ΠΎΠ²ΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Collection/Struct/Stream/String/Regex ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ. ΠΠΊΠΎ ΠΌΠΈΠ³ΡΠΈΡΠ°ΡΠ΅ ΠΎΡ .NET Framework ΠΊΡΠΌ .NET Core, ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π³ΠΎΠ»ΡΠΌΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π²Π΅Π΄Π½Π°Π³Π°. ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠΊΠ°ΡΠ²Π°ΠΌ Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π±ΡΡ
Π° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΊΡΠΌ .NET Core 3.0:
https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΎΠ³Π°ΡΠΎ ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠΎΠ΄, ΡΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ Π½Π° Π²Π°ΡΠΈΡ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°, Π·Π° Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΡΠ΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ. Π©Π΅ ΡΠ΅ ΡΠ°Π΄Π²Π°ΠΌ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π·Π½Π°Π½ΠΈΡΡΠ° ΡΠΈ ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π² .NET.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com