আধা-বৈধকরণের জন্য একটি সহজ পরীক্ষা। আমি একটি ছোট পরীক্ষা করেছি, শুধু দেখতে। কোডটি এখানে:
static void Main(string[] args)
{
List<int> intList = new List<int>();
for (int i = 0; i < 10000000; i++)
{
intList.Add(i);
}
DateTime timeStarted = DateTime.Now;
for (int i = 0; i < intList.Count; i++)
{
int foo = intList[i] * 2;
if (foo % 2 == 0)
{
}
}
TimeSpan finished = DateTime.Now - timeStarted;
Console.WriteLine(finished.TotalMilliseconds.ToString());
Console.Read();
}
এবং এখানে ভবিষ্যদ্বাণী বিভাগ:
foreach (int i in intList)
{
int foo = i * 2;
if (foo % 2 == 0)
{
}
}
আমি যখন ফরচটি প্রতিস্থাপন করলাম - ধারাবাহিকভাবে ফোরচটি 20 মিলিসেকেন্ডে দ্রুত ছিল । এর জন্য 135-139 মিমি ছিল, যখন পূর্বাঞ্চটি ছিল 113-119 মিমি। আমি বেশ কয়েকবার পিছনে ফিরে এসেছি এবং নিশ্চিত হয়েছি যে এটি এমন কোনও প্রক্রিয়া নয় যা কেবল লাথি মেরেছিল।
যাইহোক, যখন আমি foo এবং if স্টেটমেন্টটি সরিয়ে ফেললাম তখন এর জন্য 30 এমএস দ্রুত ছিল (অগ্রণীতাটি ছিল 88 মিমি এবং এর জন্য 59 মিমি)। তারা উভয় খালি খোল ছিল। আমি ধরে নিচ্ছি ভবিষ্যদ্বাণীটি আসলে একটি ভেরিয়েবল পাস করেছে যেখানে কেবল ভেরিয়েবলকে বাড়িয়ে দেওয়া হয়েছিল। আমি যদি যোগ করা হয়
int foo = intList[i];
তারপরে প্রায় 30 মিমি ধীরে ধীরে হয়ে যায়। আমি ধরে নিচ্ছি এটির সাথে foo তৈরি করা এবং অ্যারেতে ভেরিয়েবলটি দখল করা এবং এফওকে নির্ধারণ করার সাথে এটি করার ছিল। যদি আপনি কেবল ইনটলিস্ট অ্যাক্সেস করেন [i] তবে আপনার কাছে সেই দণ্ড নেই।
সমস্ত সততার সাথে .. আমি ভবিষ্যদ্বাণীটি সকল পরিস্থিতিতে সামান্য ধীর হওয়ার প্রত্যাশা করেছিল, তবে বেশিরভাগ অ্যাপ্লিকেশনে বিষয়টি যথেষ্ট নয়।
সম্পাদনা করুন: এখানে জোনস পরামর্শ ব্যবহার করে নতুন কোডটি দেওয়া হয়েছে (134217728 সিস্টেমের আগে আপনার কাছে থাকা সবচেয়ে বড় অন্তর্নিহিত .আউটআফ মেমরি ব্যতিক্রম ছুঁড়ে দেওয়া):
static void Main(string[] args)
{
List<int> intList = new List<int>();
Console.WriteLine("Generating data.");
for (int i = 0; i < 134217728 ; i++)
{
intList.Add(i);
}
Console.Write("Calculating for loop:\t\t");
Stopwatch time = new Stopwatch();
time.Start();
for (int i = 0; i < intList.Count; i++)
{
int foo = intList[i] * 2;
if (foo % 2 == 0)
{
}
}
time.Stop();
Console.WriteLine(time.ElapsedMilliseconds.ToString() + "ms");
Console.Write("Calculating foreach loop:\t");
time.Reset();
time.Start();
foreach (int i in intList)
{
int foo = i * 2;
if (foo % 2 == 0)
{
}
}
time.Stop();
Console.WriteLine(time.ElapsedMilliseconds.ToString() + "ms");
Console.Read();
}
এবং ফলাফল এখানে:
ডেটা তৈরি হচ্ছে। লুপের জন্য গণনা করা হচ্ছে: 2458 মিমি ফরেনচ লুপ গণনা করছে: 2005 মিমি
এগুলির চারপাশে অদলবদল করে এটি দেখুন যাতে এটি ক্রমের সাথে একই ফলাফল দেয় (প্রায়)।