3

所以我们尝试用 C# 开发一个数学课,我们做到了。将结果与 System.Math 的原始数学类进行比较表明,我们总是慢一点或慢很多(特别是三角方法)。

但是当我们使用像绝对值这样不包含大量代码的基本方法时,奇迹就来了

if(value < 0) return -value;
else return value;

我们仍然远远落后。

我不能让这个 abs 方法更小,我猜使用三元运算符也无济于事。

是因为 System.Math 是用 C 编写的吗?如果我们用母语写它会更快,尽管它似乎不会改变我读的太多。最后,一个 dll 是否可以比一个类更快地工作?如果是,为什么?如果不是……那么为什么也是如此?

4

2 回答 2

6

继续Servé 的评论显示 CLR 是用 C++ 编写的,您会发现Math.Abs调用fabs 或 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
于 2013-09-18T11:35:06.217 回答
1

我不认为 System.Math 中的琐碎函数是用 C 编写的,因为调用 C 的开销在许多情况下会太高。也许它们是用原始 IL 编写的,以使它们更快。

顺便说一句:你为​​什么要编写自己的数学库?这几乎从来都不是一个好主意。

于 2013-09-18T11:15:45.977 回答