से तेज क्यों है, मैंने PLINQ के साथ स्वयं को परिचित करने के लिए कुछ बुनियादी नमूना कोड लिखा था।मेरे असाइन किए गए PLINQ क्वेरी को मेरे अनियंत्रित एक
मैं कुछ अजीब में आया था। मुझे नहीं पता कि यह मेरे कोड में एक त्रुटि है या PLINQ की मेरी समझ में एक त्रुटि है।
एमएसडीएन दस्तावेज बताता है कि AsOrdered() जोड़ना प्रदर्शन की संभावित लागत पर कॉल के आदेश को सुरक्षित रखेगा।
मैंने कुछ यूनिट परीक्षण लिखे और दस्तावेज में बताए गए परिणाम सेट पर आदेश पर प्रभाव देखा। लेकिन मैंने प्रदर्शन पर प्रतिकूल प्रभाव देखा है।
public IEnumerable<int> ParallelCalculatePrimesUpTo(int maxValue)
{
return from number in Enumerable.Range(1, maxValue).AsParallel()
where IsPrime(number)
select number;
}
public IEnumerable<int> OrderedParallelCalculatePrimesUpTo(int maxValue)
{
return from number in Enumerable.Range(1, maxValue).AsParallel().AsOrdered()
where IsPrime(number)
select number;
}
और मेरे बहुत ही सरल मानक
[TestMethod]
public void SimplisticBenchmark6()
{
var primeNumberCalculator = new PrimeNumberCalculator();
var startTime = DateTime.Now;
primeNumberCalculator.ParallelCalculatePrimesUpTo(10000000).ToList();
var totalTime = DateTime.Now - startTime;
Console.WriteLine(totalTime);
}
[TestMethod]
public void SimplisticBenchmark7()
{
var primeNumberCalculator = new PrimeNumberCalculator();
var startTime = DateTime.Now;
primeNumberCalculator.OrderedParallelCalculatePrimesUpTo(10000000).ToList();
var totalTime = DateTime.Now - startTime;
Console.WriteLine(totalTime);
}
कोई फर्क नहीं पड़ता कि कितनी बार मैं इस परीक्षण चलाने का आदेश दिया संस्करण अव्यवस्थित एक बाहर धड़कता है:
यहाँ दोनों मेरे तरीका है। मुझे अपने क्वाड कोर कंप्यूटर पर आदेशित एक के लिए लगभग 4 सेकंड तेज मिलता है। मुझे आदेशित एक के लिए लगभग 18 सेकंड और अनियंत्रित के लिए 22 सेकंड मिल रहे हैं। मैंने दो दिनों के दौरान दर्जनों समय परीक्षण किए हैं (उन दिनों के बीच रिबूट के साथ)।
यदि मैं संख्या 10 000 000 से 6 000 000 कम करता हूं, तो अंतर अभी भी वहां है लेकिन कम ध्यान देने योग्य है और यदि मैं इसे 3 000 000 तक कम करता हूं, तो यह एक ही गति के बारे में है।
मैंने निष्पादन के दोनों क्रम में परीक्षण चलाने की कोशिश की और परिणाम समान हैं।
// uses inneficient trial division algorithm
private bool IsPrime(int number)
{
if (number == 1)
return false;
for (int divisor = 2; divisor <= Math.Sqrt(number); divisor++)
{
if (number % divisor == 0)
return false;
}
return true;
}
यह क्या बताते हैं:
यहाँ IsPrime विधि PLINQ क्वेरी में बुलाया जाता है?
एक साइड नोट के रूप में, 'स्टॉपवॉच' का उपयोग करके 'डेटटाइम' प्रदर्शन माप के लिए बहुत अच्छा नहीं है। – svick
@svick: बहुत अच्छा बिंदु। मुझे पता था कि डेटटाइम गंभीर माप के लिए अच्छा नहीं था लेकिन स्टॉपवॉच के बारे में नहीं पता था। धन्यवाद। उत्पादन कोड के लिए एक प्रोफाइलर का उपयोग करना बेहतर होता है, लेकिन यह केवल तेज़ और गंदे कोड था जैसा मैंने लिखा था क्योंकि मैंने PLINQ और TPL दस्तावेज़ पढ़ा था। अगली बार मैं ऐसी स्थिति में स्टॉपवॉच का उपयोग करूंगा! – Gilles
यदि मैं आपका कोड चलाता हूं, तो आदेश दिया गया है कि आदेश थोड़ा धीमा है (5.67 एस बनाम 5.66 एस अनियंत्रित है, कई प्रयासों पर औसत है), लेकिन प्रयासों के बीच भिन्नता आदेशित और अनियंत्रित के बीच के अंतर से अधिक है, इसलिए मुझे लगता है कि कोई नहीं है इस मामले में सांख्यिकीय रूप से महत्वपूर्ण अंतर (कम से कम मेरे क्वाड-कोर पर मापा गया)। – svick