ืืืฆืืขืื ื-.NET Core
ืฉืืื ืืืืื! ืืืืจ ืื ืืื ืืืกืฃ ืฉื ืฉืืืืช ืขืืืื ืืืืืฆืืช ืฉืขืืืชืื ืืื ื ืืฉืชืืฉื ื ืืืฉื ืืื ืจื ืืืฉืจ ืขืืืืื ืขื ืคืจืืืงืืื ืฉืื ืื.
ืืืืข ืขื ืืืืื ื ืฉืื ืืืฆืขื ืืืืฉืืืื:BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R), ืืขืื ืืื, 1 ืืืืืช ืืืืืืช ื-8 ืคืืืืืช
.NET Core SDK=3.0.100
[ืืืจื]: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit 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), 64bit RyuJIT
ืืืื: .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:
ืื ื ืืืืืื ืืืกืืง ืฉืขืืืื ืืืืจืืืื ืฉื ืืืกืฃ ืืขืจื ืืืืจ ืืืชืจ ืืฉื ืืืืคืืืืืืฆืืืช ืืคื ืืืืืช ืฉืื ืืืงืฆืืช ืืืื ืืืืกืฃ ืืืคืืจืฉืช ืฉืื. ืืืื ืื ืืืืืจ ืฉืืืืกืฃ 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 ืืงืฉื ืขื ืืื ืช ืืงืื ืืืืืื ืืช ืืื ืืืืฆืืข ืฉื ืืชืืื ืืช ืฉืื. ืืื ืื ืืชื ืฆืจืื ืืช ืืื ืืื ืืื, ืืชื ืื ืฆืจืื ืืืื ืืก ืืช ืฉืืจืืช ืืงืื ืฉืื ืฆืคืืืืช ืืืคื ืืฉืืืืืช - ืื ืืงื ืขื ืืื ืช ืืงืื. ืืืขืฉื, ืื ืื ืื ืืืืคืื ืืืจืืืื ืืืขื ืืช ืืืขืจืืช, ืืื ืืฉืืืช ืืฉืืืืืช ืขืฆืื ืืจื ืืื ื ื-exception new throw.
ืืจืืงืช ืืจืืืื ืืืืืช ืืืชืจ ืืืฉืจ ืืืืงื ืืืฉืื ืฉืชืืกืืฃ ืืช ืืฉืืืื ืืคืืจืื ืื ืืจืฉ. ืื ืืชื ืืขืื ืืืคืก ืื ื ืชืื ืื ืืกืืืืื ืืืชื ืืืืข ืืืืจืืจ ืื ืฆืจืืื ืืืืืช ืืฉืืืื, ืืื ืื ืืขืื ืืืชื?
ืืื ืืืชืื ืืื ื () throw new Exception ืื ืืฆื ืื ืืื ื ืืจืื. ืืืคืื ืืืจืืงืช ืืจืื ืืงืจ ืืืื!!!
ToLower, ToLowerInvariant, ToUpper, ToUpperInvariant
ืืืืื 5 ืฉื ืืช ืื ืืกืืื ืฉืื ืืขืืืื ืขื ืคืืืคืืจืืช NET, ื ืชืงืืชื ืืคืจืืืงืืื ืจืืื ืฉืืฉืชืืฉื ืืืชืืืช ืืืจืืืืช. ืจืืืชื ืื ืืช ืืชืืื ื ืืืื: ืืื ืคืชืจืื Enterprise ืืื ืขื ืืจืื ืคืจืืืงืืื, ืฉืื ืืื ืืื ืืืฆืข ืืฉืืืืืช ืืืจืืืืช ืืฆืืจื ืฉืื ื. ืืื ืืื ืืฉ ืืืฉืชืืฉ ืืืืฆื ืืืื ืืืชื? ืืกืคืจ CLR via C# ืืืช Richter, ืงืจืืชื ืืืืข ืฉืฉืืืช ToUpperInvariant() ืืืืจื ืืืชืจ ื-ToLowerInvariant().
ืงืืข ืืืกืคืจ:
ืืืืื, ืื ืืืื ืชื ืืืืืืชื ืืืจืืฅ ืื ืืื ืืืืงืืช ื-.NET Framework ืืืชืืฆืื ืืขืืขื ืืืชื - ืขืืืื ืฉื ืืืชืจ ื-15% ืืืืฆืืขืื. ืืื, ืืฉืืืขืชื ืืขืืืื ืืืืจืช ืืืืงืจ, ืืจืืืชื ืืช ืืืืืืืช ืืืื ืืืืื ืื ืขืื ืื ืชืชื ืืื ืืืฉื ืืงืื ืืืงืืจ. ืืืืจ ืืื, 2 ืืชืื 14 ืคืจืืืงืืื ืฉืื ื ืืื ืืืชืืื ืืช ืืืืืืืช ืืืืฉืืช, ืืืืชืืฉื ืืื ืฉืฉื ื ืืคืจืืืงืืื ืืืื ืืื ืงืืืืื ืืขืืืื ืืืืืืช ืืงืกื ืขื ืงืืืช, ืืชืืฆืื ืืืืชื ืืืชืจ ืืืฉืืขืืชืืช ืขืืืจ ืืืืฆืจ.
ืืื ืื, ืื ื ืืฆืื ืืคื ืืื ืืืืืืช ืขืืืจ ืืจืกืืืช ืฉืื ืืช ืฉื .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 ืืืคืืข ืงืืืคืืืฆืื ืฉืืืชืืช, ืฉืืืืืชื ืืชืื ืชืื ืืฉืงืืขื ืคืืืช ืืื ืืืฉืงืช ืคืจืืืงื.
- ืชืืืื ืืชืงื ื 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