您使用Reflector或具有MethodImplOptions.InternalCall屬性的參考源找到的任何方法實際上都是在CLR內的C++中實現的。您可以從SSCLI20發行版中獲得這些源代碼。相關文件是clr/src/vm/ecall.cpp,它包含一個帶有函數指針的方法名錶,由JIT編譯器用來直接將調用地址嵌入到生成的機器代碼中。相關的錶款是
FCIntrinsic("Cos", COMDouble::Cos, CORINFO_INTRINSIC_Cos)
FCIntrinsic("Sqrt", COMDouble::Sqrt, CORINFO_INTRINSIC_Sqrt)
FCIntrinsic("Round", COMDouble::Round, CORINFO_INTRINSIC_Round)
...
帶您到CLR/src目錄/ classlibnative /漂浮/ comfloat.cpp
FCIMPL1_V(double, COMDouble::Sqrt, double d)
WRAPPER_CONTRACT;
STATIC_CONTRACT_SO_TOLERANT;
return (double) sqrt(d);
FCIMPLEND
它只是調用CRT功能。但是,這不是x86抖動中發生的情況,請注意表格聲明中的「內部」。在SSLI20版本的抖動中,您不會發現這種情況,這是一個簡單的方法,不受專利權限制。航運一個然而並把它變成一個固有:
double d = 2.0;
Console.WriteLine(Math.Sqrt(d));
轉化爲
00000008 fld dword ptr ds:[0072156Ch]
0000000e fsqrt
..etc
換句話說,Math.Sqrt()轉換爲單個浮點機器代碼指令。查詢this answer瞭解如何輕鬆擊敗本機代碼。
出於興趣,我們最好的伴侶將在3月份時花費35美元...... – StuartLC 2011-02-08 10:30:29