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 کور 2.2 او 3.0 کې د فعالیت سرعت نږدې ورته دی. دلته هغه څه دي چې زه یې په .NET کور 3.0 کې ترلاسه کولی شم:
موږ کولی شو دې پایلې ته ورسیږو چې د سرې ټولګه تکراري پروسس کول د دې داخلي اصلاح او د راټولولو روښانه اندازې تخصیص له امله ګړندي دي. دا هم د یادولو وړ ده چې د لیست ټولګه خپلې ګټې لري او تاسو باید د اړتیا وړ محاسبې پراساس سم ټولګه وکاروئ. حتی که تاسو د لوپونو سره کار کولو لپاره منطق ولیکئ ، مه هیروئ چې دا یو عادي لوپ دی او دا د احتمالي لوپ اصلاح کولو تابع هم دی. څه موده وړاندې په حبر کې یوه مقاله خپره شوې وه: https://habr.com/ru/post/124910/. دا لاهم اړونده ده او لوستل یې وړاندیز شوي.
وغورځئ
یو کال دمخه، ما په یوه میراثي پروژه کې په یوه شرکت کې کار کاوه، په دې پروژه کې دا عادي خبره وه چې د آزموینې-کیچ-تررو ساختمان له لارې د ساحې اعتبار پروسس شي. زه دمخه پوهیدم چې دا د پروژې لپاره غیر صحي سوداګرۍ منطق و ، نو هرکله چې امکان ولري ما هڅه وکړه چې دا ډول ډیزاین ونه کاروم. مګر راځئ چې معلومه کړو چې ولې د داسې جوړونې سره د غلطیو اداره کولو طریقه خرابه ده. ما یو کوچنی کوډ لیکلی ترڅو دوه طریقې پرتله کړي او د هر اختیار لپاره معیارونه جوړ کړي.
کوډ:
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;
}
هڅه وکړئ کیچ د کوډ پوهیدل سختوي او ستاسو د برنامې اجرا کولو وخت زیاتوي. مګر که تاسو دې ساختمان ته اړتیا لرئ، تاسو باید د کوډ هغه لینونه داخل نه کړئ چې تمه نه کیږي د غلطیو اداره کول - دا به د کوډ پوهیدل اسانه کړي. په حقیقت کې ، دا د استثناییاتو اداره کول دومره ندي چې سیسټم باروي ، بلکه د تیرو نوي استثنایی جوړښت له لارې پخپله د غلطیو غورځول دي.
د استثمار غورځول د ځینې ټولګي په پرتله ورو دي چې غلطی به په اړین شکل کې راټول کړي. که تاسو یوه فورمه یا ځینې ډاټا پروسس کوئ او تاسو په روښانه توګه پوهیږئ چې تېروتنه باید څه وي، ولې دا پروسس نه کوئ؟
تاسو باید د غورځولو نوی استثنا () جوړ نه کړئ که چیرې دا وضعیت استثنایی نه وي. د استثنا اداره کول او غورځول خورا ګران دي !!!