যেহেতু আমার অনুরূপ প্রশ্ন ছিল এটি আমাকে দ্রুত শুরু করেছে।
আমার প্রশ্নটি কিছুটা সুনির্দিষ্ট, 'একটি রিফ্লেক্সিভ অ্যারে বাস্তবায়নের জন্য দ্রুততম পদ্ধতি কী'
মার্ক গ্রাভেল দ্বারা সম্পাদিত পরীক্ষাগুলি অনেক কিছু দেখায় তবে সঠিকভাবে অ্যাক্সেসের সময় নয়। তার সময়সীমার সাথে অ্যারের এবং তালিকার উপরে থাকা লুপিংও অন্তর্ভুক্ত রয়েছে। যেহেতু আমিও তৃতীয় পদ্ধতিটি নিয়ে এসেছি যা পরীক্ষা করতে চেয়েছিলাম, একটি 'অভিধান', তুলনা করার জন্য, আমি হিস্ট পরীক্ষার কোডটি প্রসারিত করেছি।
সজ্জা, আমি একটি ধ্রুবক ব্যবহার করে একটি পরীক্ষা করি, যা আমাকে লুপ সহ একটি নির্দিষ্ট সময় দেয়। প্রকৃত অ্যাক্সেস বাদ দিয়ে এটি একটি 'বেয়ার' সময়। তারপরে আমি বিষয় কাঠামো অ্যাক্সেস সহ একটি পরীক্ষা করি, এটি আমাকে এবং 'ওভারহেড অন্তর্ভুক্ত' সময়, লুপিং এবং প্রকৃত অ্যাক্সেস দেয়।
'বেয়ার' টাইমিং এবং 'ওভারহেড অন্তর্ভুক্ত' টাইমিংয়ের মধ্যে পার্থক্য আমাকে 'স্ট্রাকচার অ্যাক্সেস' টাইমিংয়ের ইঙ্গিত দেয়।
তবে এই সময়টি কতটা সঠিক? পরীক্ষার সময় উইন্ডোজ শুরের জন্য কিছু সময় স্লাইসিং করবে। সময় কাটানোর সময় সম্পর্কে আমার কাছে কোনও তথ্য নেই তবে আমি ধারনা করি এটি পরীক্ষার সময় এবং দশ মেকের ক্রম হিসাবে সমানভাবে বিতরণ করা হয় যার অর্থ সময়সীমার যথাযথতা +/- 100 ম্যাসেক বা এর মতো হওয়া উচিত। কিছুটা মোটামুটি অনুমান? যাইহোক পদ্ধতিগত mearure ত্রুটির একটি উত্স।
এছাড়াও, পরীক্ষাগুলি কোনও অনুকূলকরণ ছাড়াই 'ডিবাগ' মোডে করা হয়েছিল। অন্যথায় সংকলক প্রকৃত পরীক্ষার কোডটি পরিবর্তন করতে পারে।
সুতরাং, আমি দুটি ফলাফল পেয়েছি, একটি ধ্রুবক হিসাবে চিহ্নিত, '(সি)', এবং একটি 'অ্যাক্সেসের জন্য চিহ্নিত' (এন) 'এবং পার্থক্য' ডিটি 'আমাকে জানায় যে প্রকৃত অ্যাক্সেসটি কত সময় নেয়।
এবং এটি ফলাফল:
Dictionary(c)/for: 1205ms (600000000)
Dictionary(n)/for: 8046ms (589725196)
dt = 6841
List(c)/for: 1186ms (1189725196)
List(n)/for: 2475ms (1779450392)
dt = 1289
Array(c)/for: 1019ms (600000000)
Array(n)/for: 1266ms (589725196)
dt = 247
Dictionary[key](c)/foreach: 2738ms (600000000)
Dictionary[key](n)/foreach: 10017ms (589725196)
dt = 7279
List(c)/foreach: 2480ms (600000000)
List(n)/foreach: 2658ms (589725196)
dt = 178
Array(c)/foreach: 1300ms (600000000)
Array(n)/foreach: 1592ms (589725196)
dt = 292
dt +/-.1 sec for foreach
Dictionary 6.8 7.3
List 1.3 0.2
Array 0.2 0.3
Same test, different system:
dt +/- .1 sec for foreach
Dictionary 14.4 12.0
List 1.7 0.1
Array 0.5 0.7
সময়ের ত্রুটি সম্পর্কে আরও ভাল অনুমানের সাথে (সময় কাটানোর কারণে পদ্ধতিগত পরিমাপ ত্রুটিটি কীভাবে সরিয়ে নেওয়া যায়?) ফলাফল সম্পর্কে আরও বলা যেতে পারে।
দেখে মনে হচ্ছে লিস্ট / ফোরচের দ্রুত অ্যাক্সেস রয়েছে তবে ওভারহেড এটি হত্যা করছে।
তালিকা / ফর এবং তালিকা / পূর্বাভাসের মধ্যে পার্থক্য হ'ল স্তম্ভ। কিছু নগদ অর্থ জড়িত হতে পারে?
আরও একটি অ্যারে অ্যাক্সেসের জন্য আপনি for
লুপ বা লুপ ব্যবহার করেন তা foreach
বিবেচ্য নয়। সময়সীমার ফলাফল এবং এর যথার্থতা ফলাফলগুলিকে 'তুলনীয়' করে তোলে।
অভিধান ব্যবহার করা এখন পর্যন্ত সবচেয়ে ধীর, আমি কেবল এটি বিবেচনা করলাম কারণ বাম দিকে (সূচক) আমার কাছে একটি পরীক্ষাগুলির বিছিন্ন তালিকা রয়েছে এবং এই পরীক্ষাগুলিতে ব্যবহৃত হয় এমন কোনও পরিসর নেই।
পরিবর্তিত পরীক্ষার কোডটি এখানে।
Dictionary<int, int> dict = new Dictionary<int, int>(6000000);
List<int> list = new List<int>(6000000);
Random rand = new Random(12345);
for (int i = 0; i < 6000000; i++)
{
int n = rand.Next(5000);
dict.Add(i, n);
list.Add(n);
}
int[] arr = list.ToArray();
int chk = 0;
Stopwatch watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
int len = dict.Count;
for (int i = 0; i < len; i++)
{
chk += 1; // dict[i];
}
}
watch.Stop();
long c_dt = watch.ElapsedMilliseconds;
Console.WriteLine(" Dictionary(c)/for: {0}ms ({1})", c_dt, chk);
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
int len = dict.Count;
for (int i = 0; i < len; i++)
{
chk += dict[i];
}
}
watch.Stop();
long n_dt = watch.ElapsedMilliseconds;
Console.WriteLine(" Dictionary(n)/for: {0}ms ({1})", n_dt, chk);
Console.WriteLine("dt = {0}", n_dt - c_dt);
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
int len = list.Count;
for (int i = 0; i < len; i++)
{
chk += 1; // list[i];
}
}
watch.Stop();
c_dt = watch.ElapsedMilliseconds;
Console.WriteLine(" List(c)/for: {0}ms ({1})", c_dt, chk);
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
int len = list.Count;
for (int i = 0; i < len; i++)
{
chk += list[i];
}
}
watch.Stop();
n_dt = watch.ElapsedMilliseconds;
Console.WriteLine(" List(n)/for: {0}ms ({1})", n_dt, chk);
Console.WriteLine("dt = {0}", n_dt - c_dt);
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
for (int i = 0; i < arr.Length; i++)
{
chk += 1; // arr[i];
}
}
watch.Stop();
c_dt = watch.ElapsedMilliseconds;
Console.WriteLine(" Array(c)/for: {0}ms ({1})", c_dt, chk);
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
for (int i = 0; i < arr.Length; i++)
{
chk += arr[i];
}
}
watch.Stop();
n_dt = watch.ElapsedMilliseconds;
Console.WriteLine("Array(n)/for: {0}ms ({1})", n_dt, chk);
Console.WriteLine("dt = {0}", n_dt - c_dt);
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
foreach (int i in dict.Keys)
{
chk += 1; // dict[i]; ;
}
}
watch.Stop();
c_dt = watch.ElapsedMilliseconds;
Console.WriteLine("Dictionary[key](c)/foreach: {0}ms ({1})", c_dt, chk);
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
foreach (int i in dict.Keys)
{
chk += dict[i]; ;
}
}
watch.Stop();
n_dt = watch.ElapsedMilliseconds;
Console.WriteLine("Dictionary[key](n)/foreach: {0}ms ({1})", n_dt, chk);
Console.WriteLine("dt = {0}", n_dt - c_dt);
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
foreach (int i in list)
{
chk += 1; // i;
}
}
watch.Stop();
c_dt = watch.ElapsedMilliseconds;
Console.WriteLine(" List(c)/foreach: {0}ms ({1})", c_dt, chk);
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
foreach (int i in list)
{
chk += i;
}
}
watch.Stop();
n_dt = watch.ElapsedMilliseconds;
Console.WriteLine(" List(n)/foreach: {0}ms ({1})", n_dt, chk);
Console.WriteLine("dt = {0}", n_dt - c_dt);
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
foreach (int i in arr)
{
chk += 1; // i;
}
}
watch.Stop();
c_dt = watch.ElapsedMilliseconds;
Console.WriteLine(" Array(c)/foreach: {0}ms ({1})", c_dt, chk);
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
foreach (int i in arr)
{
chk += i;
}
}
watch.Stop();
n_dt = watch.ElapsedMilliseconds;
Console.WriteLine("Array(n)/foreach: {0}ms ({1})", n_dt, chk);
Console.WriteLine("dt = {0}", n_dt - c_dt);