MethodImplOptions.InternalCall
इसका मतलब है कि विधि वास्तव में सीएलआर में लागू की गई है, सी ++ में लिखा गया है। बस-इन-टाइम कंपाइलर आंतरिक रूप से कार्यान्वित विधियों के साथ एक तालिका को सुरक्षित करता है और सीधे C ++ फ़ंक्शन को कॉल संकलित करता है।
कोड पर एक नज़र रखने के लिए CLR के लिए स्रोत कोड की आवश्यकता होती है। आप SSCLI20 वितरण से प्राप्त कर सकते हैं । यह .NET 2.0 समय सीमा के आसपास लिखा गया था, मैंने निम्न-स्तरीय कार्यान्वयन पाया है, जैसे Math.Pow()
CLR के बाद के संस्करणों के लिए अभी भी काफी हद तक सटीक है।
लुकअप तालिका clr / src / vm / ecall.cpp में स्थित है। वह अनुभाग जो Math.Pow()
इस प्रकार दिखता है:
FCFuncStart(gMathFuncs)
FCIntrinsic("Sin", COMDouble::Sin, CORINFO_INTRINSIC_Sin)
FCIntrinsic("Cos", COMDouble::Cos, CORINFO_INTRINSIC_Cos)
FCIntrinsic("Sqrt", COMDouble::Sqrt, CORINFO_INTRINSIC_Sqrt)
FCIntrinsic("Round", COMDouble::Round, CORINFO_INTRINSIC_Round)
FCIntrinsicSig("Abs", &gsig_SM_Flt_RetFlt, COMDouble::AbsFlt, CORINFO_INTRINSIC_Abs)
FCIntrinsicSig("Abs", &gsig_SM_Dbl_RetDbl, COMDouble::AbsDbl, CORINFO_INTRINSIC_Abs)
FCFuncElement("Exp", COMDouble::Exp)
FCFuncElement("Pow", COMDouble::Pow)
// etc..
FCFuncEnd()
"COMDouble" की खोज आपको clr / src / classlibnative / float / comfloat.cpp पर ले जाती है। मैं आपको कोड छोड़ दूँगा, बस अपने लिए एक नज़र रखना होगा। यह मूल रूप से कोने के मामलों की जाँच करता है, फिर CRT के संस्करण को कॉल करता है pow()
।
केवल अन्य कार्यान्वयन विवरण जो दिलचस्प है, तालिका में FCIntrinsic मैक्रो है। यह संकेत है कि घबराना एक आंतरिक के रूप में कार्य को लागू कर सकता है। दूसरे शब्दों में, फ्लोटिंग पॉइंट मशीन कोड इंस्ट्रक्शन के साथ फंक्शन कॉल को स्थानापन्न करें। जो इसके लिए नहीं है Pow()
, इसके लिए कोई एफपीयू निर्देश नहीं है। लेकिन निश्चित रूप से अन्य सरल संचालन के लिए। उल्लेखनीय है कि यह C ++ में समान कोड की तुलना में C # में फ्लोटिंग पॉइंट गणित को काफी तेज बना सकता है, इस कारण की वजह से इस उत्तर को जांचें ।
वैसे, यदि आप Visual Studio vc / crt / src निर्देशिका का पूर्ण संस्करण है, तो CRT के लिए स्रोत कोड भी उपलब्ध है। आप दीवार पर हिट करेंगे pow()
, हालांकि, Microsoft ने इंटेल से वह कोड खरीदा था। इंटेल इंजीनियरों की तुलना में बेहतर काम करने की संभावना नहीं है। हालाँकि मेरी हाई-स्कूल किताब की पहचान दो बार तेज़ थी जब मैंने इसे आज़माया:
public static double FasterPow(double x, double y) {
return Math.Exp(y * Math.Log(x));
}
लेकिन एक सही विकल्प नहीं है क्योंकि यह 3 फ्लोटिंग पॉइंट ऑपरेशंस से एरर जमा करता है और पॉवो () के अजीबोगरीब डोमेन समस्याओं से नहीं निपटता है। जैसे 0 ^ 0 और -इन्फिनिटी किसी भी शक्ति के लिए उठाया।
InternalCall
एकextern
संशोधक के साथ पूरे के बारे में भ्रमित हैं (जैसा कि वे परस्पर विरोधी प्रतीत होते हैं), तो कृपया प्रश्न (और परिणामी उत्तर) देखें जो मैंने इस एक ही चीज़ के बारे में पोस्ट किया है।