所以我们尝试在C#中开发数学课,我们做到了。 将结果与System.Math的原始数学类进行比较表明,我们总是迟到一点或很多(特别是trig方法)。
但是当我们使用像Absolut这样的基本方法时,我们就会感到奇怪,除了
之外不包含大量代码if(value < 0) return -value;
else return value;
但我们仍远远落后。
我无法使这个abs方法更小,使用三元运算符也无济于事。
是因为System.Math会用C编写吗? 如果我们用母语写它会更快,虽然它看起来不会改变太多我读。 最后,一个DLL可以比一个类更快地工作,如果是这样,为什么,如果不是......那么为什么呢?
谢谢。
答案 0 :(得分:3)
继续显示CLR的Servé's comment是用C ++编写的,您会发现Math.Abs
调用fabs or fabsf。
FCIntrinsicSig("Abs", &gsig_SM_Flt_RetFlt, COMDouble::AbsFlt, CORINFO_INTRINSIC_Abs)
FCIntrinsicSig("Abs", &gsig_SM_Dbl_RetDbl, COMDouble::AbsDbl, CORINFO_INTRINSIC_Abs)
/*=====================================AbsFlt=====================================
**
==============================================================================*/
FCIMPL1_V(float, COMDouble::AbsFlt, float f)
WRAPPER_CONTRACT;
STATIC_CONTRACT_SO_TOLERANT;
FCUnique(0x14);
return fabsf(f);
FCIMPLEND
/*=====================================AbsDbl=====================================
**
==============================================================================*/
FCIMPL1_V(double, COMDouble::AbsDbl, double d)
WRAPPER_CONTRACT;
STATIC_CONTRACT_SO_TOLERANT;
return fabs(d);
FCIMPLEND
答案 1 :(得分:0)
我不认为System.Math中的普通函数是用C语言编写的,因为调用C的开销在很多情况下会太高。也许它们是用原始IL编写的,以使它们更快。
顺便说一句:你为什么要写自己的数学库?这几乎不是一个好主意。