के साथ सर्वश्रेष्ठ अभ्यास मैं एक एन छवि प्रसंस्करण लाइब्रेरी पर काम कर रहा हूं जो ओपनसीवी, हल्कॉन, ... को बढ़ाता है। पुस्तकालय .NET Framework 3.5 के साथ होना चाहिए और चूंकि .NET के साथ मेरे अनुभव सीमित हैं, इसलिए मैं प्रदर्शन के संबंध में कुछ प्रश्न पूछना चाहता हूं।Math.Pow
मुझे कुछ विशिष्ट चीजों का सामना करना पड़ा है जो मैं स्वयं को सही तरीके से समझा नहीं सकता हूं और आपसे पूछना चाहते हैं) क्यों और बी) मामलों से निपटने का सबसे अच्छा अभ्यास क्या है।
मेरा पहला सवाल Math.pow के बारे में है। मुझे पहले से ही स्टैक ओवरफ्लो पर कुछ जवाब मिल गए हैं जो इसे काफी अच्छी तरह बताते हैं (ए) लेकिन इस बारे में क्या नहीं करना है (बी)। मेरे बेंचमार्क कार्यक्रम लगता है कि यह
Stopwatch watch = new Stopwatch(); // from the Diagnostics class
watch.Start();
for (int i = 0; i < 1000000; i++)
double result = Math.Pow(4,7) // the function call
watch.Stop()
परिणाम बहुत अच्छा है (~ अपने कंप्यूटर पर 300 मि.से) नहीं था (10 बार परीक्षण मैं चलने तथा औसत मूल्य calcuated)।
मेरा पहला विचार गीलेर को जांचना था क्योंकि यह एक स्थिर कार्य है। इसलिए मैं के माध्यम से अपने ही वर्ग
class MyMath
{
public static double Pow (double x, double y) //Using some expensive functions to calculate the power
{
return Math.Exp(Math.Log(x) * y);
}
public static double PowLoop (double x, int y) // Using Loop
{
double res = x;
for(int i = 1; i < y; i++)
res *= x;
return res;
}
public static double Pow7 (double x) // Using inline calls
{
return x * x * x * x * x * x * x;
}
}
अगर मैं Math.Pow (4,7) की जगह लेंगे तीसरी बात मैं जाँच थे सीधे लागू किया 4 * 4 * 4 * 4 * 4 * 4 * 4। पाउ के लिए गणित का उपयोग न करें:
परिणाम (10 परीक्षण से बाहर औसत चलाता है)
300 ms Math.Pow(4,7)
356 ms MyMath.Pow(4,7) //gives wrong rounded results
264 ms MyMath.PowLoop(4,7)
92 ms MyMath.Pow7(4)
16 ms 4*4*4*4*4*4*4
अब मेरी स्थिति अब इस तरह मूल रूप से है। मेरी एकमात्र समस्या यह है कि ... क्या मुझे वास्तव में अपनी खुद की गणित कक्षा को लागू करना है? यह किसी भी तरह से बिजली समारोह के लिए अपनी कक्षा को लागू करने के लिए अप्रभावी लगता है। (बीटीडब्ल्यू। पॉवेलूप और पॉव 7 रिलीज में तेजी से ~ 25% की वृद्धि करते हैं जबकि मैथ.पॉव नहीं है)।
तो मेरा अंतिम सवाल
हैं क) मैं गलत करता है, तो मैं सभी (लेकिन अंशों शायद) (जो मुझे किसी भी तरह उदास कर देता है के लिए) पर Math.Pow का उपयोग नहीं होता हूँ।
बी) यदि आपके पास अनुकूलित करने के लिए कोड है, तो क्या आप वास्तव में ऐसे सभी गणितीय परिचालनों को सीधे लिख रहे हैं?
ग) वहाँ शायद पहले से ही एक तेजी से (खुला स्रोत ^^) गणितीय क्रियाओं
घ) मेरे सवाल के स्रोत के लिए पुस्तकालय है मूल रूप से है: मैं मान लिया है कि .नेट फ्रेमवर्क खुद को पहले से ही बहुत अनुकूलित प्रदान करता है इस तरह के बुनियादी परिचालनों के लिए कोड/संकलन परिणाम - क्या यह गणित-वर्ग या हैंडलिंग सरणी हो और मैं थोड़ा आश्चर्यचकित था कि मुझे अपना कोड लिखकर कितना लाभ मिलेगा। क्या सी # में देखने के लिए कुछ अन्य, सामान्य "फ़ील्ड" या कुछ और है जहां मैं सीधे सी # पर भरोसा नहीं कर सकता।
मुझे लगता है कि 4 * 4 * 4 * 4 * 4 * 4 * 4 का संकलन समय पर मूल्यांकन किया जाएगा, इसलिए यह बहुत तेज है। – Nick
मुझे लगता है कि ज्यादातर लोगों के लिए 100ms या तो एक बड़ा सौदा नहीं है। सी # अक्सर ज्यादातर लोगों से ऐसे अनुप्रयोगों के लिए पहली पसंद नहीं है। – Ian
क्या आपने बड़ी संख्या में परीक्षण किया था? मुझे लगता है कि Math.Pow को बड़े एक्सपोनेंट्स के लिए अनुकूलित किया गया है, और यह सामान करता है: x^7 == x^{3 + 3 + 1} == {x^3 + x^3 x}, जिसका अर्थ यह चल रहा है आदेश rougly ओ (लॉग (एन)) है, जबकि आपका समाधान ओ (एन) है, और शायद बड़े घाटे के लिए बहुत धीमी होगी। – markijbema