Aloha kākou! ʻO kēia ʻatikala he hōʻuluʻulu o nā hana maikaʻi loa aʻu a me koʻu mau hoa hana i hoʻohana ai no ka manawa lōʻihi i ka hana ʻana i nā papahana like ʻole.
ʻIke e pili ana i ka mīkini i hana ʻia ai nā helu:BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R), 1 CPU, 8 logical a me 4 kino kino.
.NET Core SDK=3.0.100
[Host]: .NET Core 2.2.7 (CoreCLR 4.6.28008.02, CoreFX 4.6.28008.03), 64bit RyuJIT
Kumu: .NET Kohu 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
Kumu: .NET Kohu 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
Noʻu iho, makemake wau e hōʻike iā ʻoe i kaʻu mau ana a me nā hopena; Ua hoʻohui au i nā puka lou i hope iā lākou no ka poʻe aloha i ka "C++ style" o nā puka lou.
Kuhikuhi:
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;
}
}
ʻAneʻane like nā māmā hana ma .NET Core 2.2 a me 3.0. Eia ka mea i hiki ia'u ke loaa ma .NET Core 3.0:
Hiki iā mākou ke hoʻoholo ʻoi aku ka wikiwiki o ka hoʻoili ʻana o kahi hōʻiliʻili Array ma muli o kāna mau loiloi kūloko a me ka hoʻokaʻawale ʻana i ka nui o ka hōʻiliʻili. Pono e hoʻomanaʻo ʻia he mau pono ponoʻī ko kahi hōʻiliʻili List a pono ʻoe e hoʻohana i ka hōʻiliʻili kūpono ma muli o nā helu i koi ʻia. ʻOiai inā ʻoe e kākau i ka loiloi no ka hana ʻana me nā puka lou, mai poina ʻo ia he loop maʻamau a hiki nō hoʻi i ka loiloi loop optimization. Ua paʻi ʻia kahi ʻatikala ma habr i kahi manawa lōʻihi aku nei: https://habr.com/ru/post/124910/. He kūpono a paipai ʻia ka heluhelu ʻana.
Kiola
I hoʻokahi makahiki i hala aku nei, ua hana au ma kahi hui ma kahi papahana hoʻoilina, ma ia papahana he mea maʻamau ka hana ʻana i ka hōʻoia kahua ma o ka hana hoʻāʻo-hopu-kiola. Ua hoʻomaopopo mua wau he loiloi ʻoihana maikaʻi ʻole kēia no ka papahana, no laila i ka wā hiki ke hoʻāʻo wau e hoʻohana ʻole i kēlā ʻano hoʻolālā. Akā, e noʻonoʻo kākou i ke kumu o ka hoʻokokoke ʻana i nā hewa me ia ʻano hana ʻino. Ua kākau wau i kahi code liʻiliʻi e hoʻohālikelike i nā ala ʻelua a hana i nā pae kuhikuhi no kēlā me kēia koho.
Kuhikuhi:
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;
}
Loaʻa i nā hopena ma .NET Core 3.0 a me Core 2.2 ka hopena like (.NET Core 3.0):
ʻO ka hoʻāʻo ʻana i ka hopu e ʻoi aku ka paʻakikī o ke code a hoʻonui i ka manawa hoʻokō o kāu polokalamu. Akā inā makemake ʻoe i kēia kūkulu ʻana, ʻaʻole pono ʻoe e hoʻokomo i kēlā mau laina o ke code i manaʻo ʻole ʻia e mālama i nā hewa - e maʻalahi kēia i ke code e hoʻomaopopo. ʻO ka ʻoiaʻiʻo, ʻaʻole ia ka nui o ka mālama ʻana i nā ʻokoʻa e hoʻouka ai i ka ʻōnaehana, akā ʻo ka hoʻolei ʻana i nā hewa iā lākou iho ma o ka hoʻolei ʻana i kahi kūkulu Exception hou.
ʻOi aku ka lohi o ka hoʻolei ʻana i nā ʻokoʻa ma mua o kekahi papa e hōʻiliʻili i ka hewa ma ke ʻano i koi ʻia. Inā ʻoe e hana nei i kahi palapala a i ʻole kekahi ʻikepili a ʻike maopopo ʻoe i ke ʻano o ka hewa, no ke aha e hana ʻole ai?
ʻAʻole pono ʻoe e kākau i kahi kūkulu Exception () hou inā ʻaʻole ʻokoʻa kēia kūlana. He pipiʻi loa ka lawelawe ʻana a me ka hoʻolei ʻana i kahi ʻokoʻa!!!
I loko o kaʻu mau makahiki 5 o ka ʻike e hana ana ma ka .NET platform, ua loaʻa iaʻu nā papahana he nui i hoʻohana i ka hoʻohālikelike aho. Ua ʻike pū au i ke kiʻi aʻe: aia hoʻokahi hoʻonā Enterprise me nā papahana he nui, ʻokoʻa kēlā me kēia mea i hoʻohālikelike i nā string. Akā he aha ka mea e hoʻohana ai a pehea e hoʻohui ai? Ma ka puke CLR ma o C# na Richter, heluhelu au i ka ʻike e ʻoi aku ka wikiwiki o ke ʻano ToUpperInvariant() ma mua o ToLowerInvariant().
Wehe mai ka puke:
ʻOiaʻiʻo, ʻaʻole wau i manaʻoʻiʻo a ua hoʻoholo wau e holo i kekahi mau hoʻāʻo a laila ma ka .NET Framework a ua hoʻokūhoihoi ka hopena iaʻu - ʻoi aku ma mua o 15% ka piʻi ʻana o ka hana. A laila, i ka hōʻea ʻana i ka hana i ke kakahiaka aʻe, hōʻike wau i kēia mau ana i koʻu mau luna a hāʻawi iā lākou i ke komo ʻana i ke code kumu. Ma hope o kēia, ua hoʻololi ʻia ka 2 o 14 mau papahana no ka hoʻokō ʻana i nā ana hou, a me ka noʻonoʻo ʻana ua loaʻa kēia mau papahana ʻelua e hoʻoponopono i nā papa Excel nui, ʻoi aku ka nui o ka hopena no ka huahana.
Ke hōʻike aku nei au iā ʻoe i nā ana no nā mana like ʻole o .NET Core, i hiki i kēlā me kēia o ʻoukou ke koho i ka hopena maikaʻi loa. A makemake wale wau e hoʻohui i kēlā i ka hui kahi aʻu e hana ai, hoʻohana mākou iā ToUpper () e hoʻohālikelike i nā kaula.
Kuhikuhi:
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();
}
Ma ka .NET Core 3.0, ʻo ka hoʻonui ʻana no kēlā me kēia ʻano hana ʻo ~x2 a kaulike i nā hoʻokō i waena o lākou iho.
Houluulu Papa
Ma kaʻu ʻatikala hope ua wehewehe pōkole wau i kēia hana, makemake wau e hoʻoponopono a hoʻohui i kaʻu mau ʻōlelo. ʻO ka hoʻohui ʻana i nā pae he nui ka wikiwiki o ka manawa hoʻomaka o kāu hoʻonā, akā ke kaumaha nei ʻoe i nā ʻāpana o kāu code e hōʻuluʻulu ʻia i kahi mana i ʻoi aku ka maikaʻi ma ke kua, hiki ke hoʻolauna i kahi overhead liʻiliʻi. Me ka hiki ʻana mai o NET Core 3.0, ua emi ka manawa kūkulu no nā papahana me ka tier compilation enabled a ua hoʻopaʻa ʻia nā pōpoki pili me kēia ʻenehana. Ma mua, ua alakaʻi kēia ʻenehana i nā hewa i nā noi mua ma ASP.NET Core a hoʻokuʻu i ka wā o ke kūkulu mua ʻana i ke ʻano hoʻohuihui multi-level. Hoʻohana ʻia ia ma ka paʻamau ma .NET Core 3.0, akā hiki iā ʻoe ke hoʻopau iā ia inā makemake ʻoe. Inā ʻoe ma ke kūlana o ke alakaʻi kime, poʻokela, waena, a ʻo ʻoe paha ke poʻo o kahi ʻoihana, a laila pono ʻoe e hoʻomaopopo i ka hoʻomohala ʻana o ka papahana wikiwiki e hoʻonui i ka waiwai o ka hui a ʻo kēia ʻenehana e ʻae iā ʻoe e mālama i ka manawa no nā mea hoʻomohala ʻelua. a me ka manawa o ka papahana pono'ī.
.NET pae i luna
Hoʻonui i kāu mana .NET Framework / .NET Core. ʻO ka manawa pinepine, hāʻawi kēlā me kēia mana hou i nā lanakila hana hou a hoʻohui i nā hiʻohiʻona hou.
Akā he aha nā pōmaikaʻi? E nānā kākou i kekahi o lākou:
Hoʻokomo ʻo NET Core 3.0 i nā kiʻi R2R e hōʻemi i ka manawa hoʻomaka o nā noi NET Core.
Me ka mana 2.2, ua ʻike ʻia ʻo Tier Compilation, e hoʻomaikaʻi i nā mea polokalamu e hoʻolōʻihi i ka manawa e hoʻomaka ai i kahi papahana.
Kākoʻo no nā kūlana .NET hou.
Kākoʻo no ka mana hou o ka ʻōlelo papahana.
Optimization, me kēlā me kēia mana hou ka hoʻonui ʻana i nā waihona waihona waihona Collection / Struct / Stream / String / Regex a ʻoi aku ka maikaʻi. Inā ʻoe e neʻe ana mai ka .NET Framework a i ka .NET Core, e loaʻa iā ʻoe kahi hoʻoikaika nui o ka hana ma waho o ka pahu. No ka laʻana, hoʻopili wau i kahi loulou i kekahi o nā optimizations i hoʻohui ʻia i .NET Core 3.0: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/
hopena
I ke kākau ʻana i nā code, pono e nānā i nā ʻano like ʻole o kāu papahana a me ka hoʻohana ʻana i nā hiʻohiʻona o kāu ʻōlelo papahana a me ka paepae e loaʻa ai ka hopena maikaʻi loa. E hauʻoli wau inā e kaʻana like ʻoe i kāu ʻike pili i ka optimization ma .NET.