अर्ध-मान्य करने के लिए एक आसान परीक्षा। मैंने एक छोटा सा परीक्षण किया, बस देखने के लिए। यहाँ कोड है:
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-139ms था, जबकि फॉरेक्स 113-119ms था। मैंने कई बार आगे और पीछे स्वैप किया, यह सुनिश्चित करते हुए कि यह कुछ प्रक्रिया नहीं थी जो बस में किक की गई थी।
हालांकि, जब मैंने फू और इफ स्टेटमेंट को हटा दिया, तो इसके लिए 30 ms (foreach 88ms और 59ms के लिए) द्वारा तेज़ किया गया था। वे दोनों खाली गोले थे। मैं मान रहा हूँ कि वास्तव में फॉरेक्स एक वैरिएबल पारित कर दिया है, जहाँ फ़ॉर वैरिएबल केवल एक वैरिएबल बढ़ा रहा था। अगर मैंने जोड़ा
int foo = intList[i];
फिर लगभग 30ms तक धीमा हो जाता है। मैं मान रहा हूँ कि इसके साथ foo बनाने और सरणी में वैरिएबल को हथियाने और इसे foo को असाइन करना था। यदि आप केवल intList [i] का उपयोग करते हैं, तो आपके पास वह जुर्माना नहीं है।
सभी ईमानदारी में .. मैं उम्मीद करता था कि सभी परिस्थितियों में फॉर्च्यूनर थोड़ा धीमा होगा, लेकिन अधिकांश अनुप्रयोगों में यह पर्याप्त नहीं होगा।
संपादित करें: यहाँ Jons सुझावों का उपयोग करते हुए नया कोड है (134217728, SystemOutOfMemory अपवाद को फेंकने से पहले आपके पास सबसे बड़ा int हो सकता है):
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();
}
और यहाँ परिणाम हैं:
डेटा जनरेट करना। लूप के लिए गणना: 2458ms फॉरेस्ट लूप की गणना: 2005ms
उन्हें देखने के लिए चारों ओर स्वैप करना कि क्या यह चीजों के क्रम से संबंधित है, समान परिणाम (लगभग) देता है।