您使用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