.NET Core ááœáẠá áœááºážáá±á¬ááºáááº
á¡á¬ážáá¯á¶ážáááºá¹ááá¬áá«! á€áá±á¬ááºážáá«ážááẠááá°áá®áá±á¬ ááá±á¬áá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá¬ááœáẠáá»áœááºá¯ááºááŸáá·áº áá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬áž á¡áá»áááºá¡áá±á¬áºááŒá¬ á¡áá¯á¶ážááŒá¯áá²á·ááá·áº á¡áá±á¬ááºážáá¯á¶áž á¡áá±á·á¡áá»áá·áºáá»á¬áž á
á¯á
ááºážááŸá¯ááŒá
áºáááºá
ááœááºáá»ááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºáá²á·ááá·áº á
ááºá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááº-BenchmarkDotNet=v0.11.5á OS=Windows 10.0.18362
Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R)á CPU 1 áá¯á¶ážá áá¯áá¹áááááºáž 8 áᯠááŸáá·áº áá¯ááºááá¯ááºážááá¯ááºáᬠcore 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 ááŸáá·áº 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 ááœáẠáá»áœááºá¯áẠáááá¯ááºááẠá
áááºážáá¡ááœááºážááá¯ááºáž ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŸá¯áá»á¬ážááŸáá·áº áááá»ááŒááºáá¬ážáá±á¬ á
á¯áá±á¬ááºážááŸá¯á¡ááœááºá¡á
á¬ážááœá²áá±ááŸá¯ááá¯á·ááŒá±á¬áá·áº áááºááá²áá²áá¯ááºáá±á¬ááºááŒááºážááẠááá¯ááá¯ááŒááºáááºááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á·áá±á¬ááºáá»ááºáá»ááá¯ááºáá«áááºá á
á¬áááºážá
á¯áá±á¬ááºážááŸá¯ááœáẠáááºážáááá¯ááºááá¯ááºá¡á¬ážáá¬áá»ááºáá»á¬ážááŸáááŒá®áž ááá¯á¡ááºááá·áºááœááºáá»ááºááŸá¯áá±á«áºáá°áááºá ááŸááºáááºáá±á¬á
á¯áá±á¬ááºážááŸá¯ááᯠá¡áá¯á¶ážááŒá¯ááá·áºáááºááá¯áááºáž ááŸááºáá¬ážááá¯ááºáááºá loops áá²á· á¡áá¯ááºáá¯ááºááá¯á·á¡ááœáẠlogic áá±ážáá¬ážáááºáá±á¬áẠáá«á áá¬ááẠloop áá
áºáá¯ááŒá
áºááŒá®áž ááŒá
áºááá¯ááºáá²á· loop optimization ááá¯áááºáž áá°áááºáá«áááºá áá±á¬ááºážáá«ážáá
áºáá¯ááºááᯠhabr ááœáẠáá¯ááºáá±áá²á·áááºááŸá¬ ááŒá¬ááŒá®ááŒá
áºáááºá
áá áº
ááœááºáá²á·ááá·áºáá áºááŸá áºá áá»áœááºáá±á¬áºááẠá¡ááœá±á¡ááŸá áºááá±á¬áá»ááºáá áºáá¯ááœáẠáá¯áá¹ááá®áá áºáá¯ááœáẠá¡áá¯ááºáá¯ááºáá²á·ááŒá®ážá ááá¯ááá±á¬áá»ááºááœáẠá ááºážáá-áááºáž-áá áºáá±á¬ááºáááºáá±á¬ááºááŸá¯ááŸáá áºááá·áº ááœááºážáááºážá á áºáá±ážááŒááºážááᯠáá¯ááºáá±á¬ááºááẠáá¯á¶ááŸááºááŒá áºáááºá áá«á ááá±á¬áá»ááºá¡ááœáẠáá»ááºážáá¬áá±ážáá²á· ááá®ááœááºáá²á· á á®ážááœá¬ážáá±ážááá¯ááºáᬠáá¯áá¹áááá áºáá¯ááá¯á· áá¬ážáááºáá¬ážááŒá®ážááŒá áºáá¬ááŒá±á¬áá·áº ááŒá áºááá¯ááºááẠáá®ááá¯áá®ááá¯ááºážáá»áá¯ážááᯠááá¯á¶ážááá¯á· ááŒáá¯ážá á¬ážáá²á·áááºá áá«áá±ááá·áº áá®ááá¯áááºáá±á¬ááºááŸá¯ááŸá¬ á¡ááŸá¬ážá¡ááœááºážááœá±ááᯠááá¯ááºááœááºááŒá±ááŸááºážáá¯á¶á áá¬ááŒá±á¬áá·áº ááá±á¬ááºážáá²ááá¯áᬠá¡ááŒá±ááŸá¬ááŒáá·áºáá¡á±á¬ááºá áá»ááºážáááºááŸá¯ááŸá áºáá¯ááᯠááŸáá¯ááºážááŸááºááŒá®áž ááœá±ážáá»ááºááŸá¯áá áºáá¯á á®á¡ááœáẠá á¶ááŸá¯ááºážáá»á¬ážááᯠááŒá¯áá¯ááºááẠáá¯ááºáááºáá áºáá¯áá±ážáá²á·áááºá
áá¯ááº:
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 á¡áá
áºááᯠáá±á¬ááºááœááºážá áááºážááá¯á·ááá¯ááºááá¯áẠá¡ááŸá¬ážáá»á¬ážááᯠáá
áºáá»ááŒááºážáᬠááŒá
áºáááºá
ááŒáœááºážáá»ááºáá»á¬ážá¡á¬áž ááœáŸáá·áºáá áºááŒááºážááẠááá¯á¡ááºáá±á¬ áá±á¬áºáááºááœáẠá¡ááŸá¬ážááᯠá á¯áá±á¬ááºážááá·áº á¡áá»áá¯á·á¡áááºážáá»á¬ážááẠááŸá±ážááœá±ážáááºá áááºááẠáá±á¬ááºáá áºáᯠááá¯á·ááá¯áẠáá±áá¬á¡áá»áá¯á·ááᯠáá¯ááºáá±á¬ááºáá±ááŒá®áž á¡ááŸá¬ážá¡ááœááºážááŒá áºááá·áºáááºááᯠááŸááºážááŸááºážáááºážáááºážáááá«áá áááºážááᯠá¡áááºááŒá±á¬áá·áº ááá¯ááºáá±á¬ááºááááºážá
á€á¡ááŒá±á¡áá±áááºááŒáœááºážáá»ááºááá¯ááºáá«á Exception() á¡áá áºáááºáá±á¬ááºááŒááºážááᯠáááºááá±ážááá·áºáá«á ááŒáœááºážáá»ááºáá áºáá¯á¡á¬áž ááá¯ááºááœááºááŒááºážááŸáá·áº áá áºáá»ááŒááºážááẠá¡ááœááºá á»á±ážááŒá®ážáááºá
á¡á±á¬ááºááá¯á·á á០á¡á±á¬ááºááá¯á· á¡ááºáá¬áá®áááºá
.NET ááááºáá±á¬ááºážááœáẠá¡áá¯ááºáá¯ááºááá·áº á¡ááœá±á·á¡ááŒá¯á¶ 5 ááŸá áºáá»á±á¬áºá string matching ááá¯áá¯á¶ážáá±á¬ ááá±á¬áá»ááºáá»á¬ážá áœá¬ááᯠááœá±á·áá²á·ááááºá á¡á±á¬ááºáá±á¬áºááŒáá«áá¯á¶ááá¯áááºáž áá»áœááºáá±á¬áºááŒááºáá²á·áááº- ááá±á¬áá»ááºáá»á¬ážá áœá¬áá«ááŸááá±á¬ Enterprise ááŒá±ááŸááºážáá»ááºáá áºáá¯ááŸááá«áááºá áá áºáá¯á á®ááẠstring comparisons áá»á¬ážááᯠááœá²ááŒá¬ážá áœá¬áá¯ááºáá±á¬ááºáááºá áá«áá±ááá·áº áá¬ááá¯áá¯á¶ážááá·áºááá²á áááºááá¯áá±á«ááºážá ááºáááá²á C# by Richter ááŸáá áºááá·áº CLR á á¬á¡á¯ááºááœááºá 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
áá»áœááºá¯ááºááá±á¬ááºáá¯á¶ážáá±á¬ááºážáá«ážááœáẠá€áá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠá¡ááá¯áá»á¯á¶ážáá±á¬áºááŒáá²á·ááŒá®ážá áá»áœááºá¯ááºáá áá¬ážáá¯á¶ážáá»á¬ážááᯠááŒá¯ááŒááºááŒáá·áºá áœááºááá¯áá«áááºá Multi-level compilation ááẠááá·áºááŒá±ááŸááºážáá»ááºá á áááºáá»áááºááᯠá¡ááŸáááºááŒáŸáá·áºáá±ážáááºá ááá¯á·áá±á¬áº ááá·áºáá¯ááºá á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠáá±á¬ááºáá¶ááœáẠááá¯áá±á¬ááºážá¡á±á¬áẠá á¯á ááºážáá¬ážáá±á¬ áá¬ážááŸááºážá¡ááŒá áºááá¯á· á áœáá·áºá á¬ážááŒá®áž áá±ážáááºáá±á¬ overhead ááᯠááááºáááºáá±ážááá¯ááºáá«áááºá NET Core 3.0 ááœááºážáá¬ážáá¬áááºááŸáá·áºá¡áá»áŸá á¡ááá·áºááá¯ááºá á¯á ááºážááŸá¯ááœáá·áºáá¬ážááá·áº ááá±á¬áá»ááºáá»á¬ážá¡ááœáẠáááºáá±á¬ááºáá»áááºááẠáá»á±á¬á·áááºážááœá¬ážáᬠá€áááºážááá¬ááŸáá·áºáááºá ááºáá±áá±á¬ áá»áœááºááœááºážáá»ááºáá»á¬ážááᯠááŒááºáááºááŒá®ážááŒá áºáááºá ááááºáá á€áááºážááá¬ááẠASP.NET Core ááœáẠááááá¯á¶ážáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááœáẠá¡ááŸá¬ážá¡ááœááºážáá»á¬ážááŒá áºáá±á«áºá á±ááŒá®áž Multi-level compilation mode ááœáẠááááá¯á¶ážáááºáá±á¬ááºá ááºááœáẠáááºááá·áºááœá¬ážáá²á·áááºá áááºážááᯠ.NET Core 3.0 ááœáẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº áááºááŸáááœáẠááœáá·áºáá¬ážáá±á¬áºáááºáž áááºááá¹áááŸááá«á áááºážááᯠááááºááá¯ááºáááºá á¡áááºá áááºááẠá¡ááœá²á·áá±á«ááºážáá±á¬ááºá á¡ááŒá®ážáááºážá á¡áááºáááºážá ááá¯á·ááá¯áẠáááºááẠáá¬ááá áºáá¯á á¡ááŒá®ážá¡áá²ááŒá áºáá«áá áá»ááºááŒááºáá±á¬ááá±á¬áá»ááºááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááẠá¡ááœá²á·ááááºááá¯ážááᯠááá¯ážá á±ááŒá®áž á€áááºážááá¬ááẠááá·áºá¡á¬áž developer ááŸá áºáŠážá áá¯á¶ážá¡ááœáẠá¡áá»áááºáá¯ááºáááºáá¬á á±áááºááŒá áºááŒá±á¬ááºáž áááºáá¬ážáááºáá¬ážááá«áááºá ááá±á¬áá»ááºáá¡áá»áááºáááºážááŒá áºáááºá
.NET á¡ááá·áºáááº
áááºá .NET Framework / .NET Core áá¬ážááŸááºážááᯠá¡ááá·áºááŒáŸáá·áºáá«á áááŒá¬ááááá¯áááá¯á áá¬ážááŸááºážá¡áá áºáá áºáá¯á á®ááẠá¡ááá¯á áœááºážáá±á¬ááºááẠá¡áá»áá¯ážáá»á±ážáá°ážáá»á¬ážááᯠáá±ážá áœááºážááŒá®áž á¡ááºá¹áá«áááºá¡áá áºáá»á¬ážááᯠááá·áºáá±ážáá«áááºá
áá«áá±ááá·áº á¡ááá¡áá» áá¬á¡áá»áá¯ážáá»á±ážáá°ážááœá±áá²á áááºážááá¯á·áá²á០á¡áá»áá¯á·ááᯠááŒáá·áºááŒáá«á áá¯á·á
- .NET Core 3.0 ááẠ.NET Core á¡ááá®áá±ážááŸááºážáá»á¬ážá á áááºáá»áááºááᯠáá»áŸá±á¬á·áá»áá±ážááá·áº R2R áá¯á¶áá»á¬ážááᯠááááºáááºáá±ážáá²á·áááºá
- áá¬ážááŸááºáž 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 ááœáẠoptimization ááŸáá·áºáááºáááºááá·áº áááºáá¡ááááá¬ááᯠáá»áŸáá±áá±ážáááºááá¯áá«á áááºážááŒá±á¬ááºáááá«áááºá