3

そこで、C# で数学クラスを開発してみました。結果を System.Math の元の数学クラスと比較すると、常に多少または大幅に遅いことがわかります (特にトリガー メソッド)。

しかし、コード以外の負荷を含まない絶対値のような基本的な方法を使用しているときに不思議が生じます。

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

それでも私たちははるかに遅れています。

この abs メソッドをこれ以上小さくすることはできません。三項演算子を使用しても役に立たないと思います。

System.Math が C で記述されるためでしょうか。母国語で書いた方が早いのですが、読んでもあまり変わらないようです。最後に、dll はクラスよりも高速に動作する可能性があります。

4

2 に答える 2

6

CLR が C++ で記述されていることを示すServé のコメントを続けると、 fabsまたは fabsfMath.Absを呼び出すことがわかります。

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

I don't think trivial functions in System.Math are written in C because the overhead of calling out to C would be in many cases much too high. Maybe they are written in raw IL to make them extra fast.

BTW: Why would you write your own math library? This is almost never a good idea.

于 2013-09-18T11:15:45.977 に答える