私のプロジェクトでは、多くの時間をASINで計算する必要があります。 C#では時間がかかります。ArcSinの高速実装または近似C#
私は、System名前空間
から質問がC#で速く阿機能を実装する方法があるMath.Asin()を使用します。
どんな近似アルゴリズムや、より高速に動作する別の実装ですか?
私のプロジェクトでは、多くの時間をASINで計算する必要があります。 C#では時間がかかります。ArcSinの高速実装または近似C#
私は、System名前空間
から質問がC#で速く阿機能を実装する方法があるMath.Asin()を使用します。
どんな近似アルゴリズムや、より高速に動作する別の実装ですか?
テストのコメントとベンチマークで議論が行われた後、私が下で示した解決策が実際にSystem.Math.Asin()
のパフォーマンスを改善するつもりはないことは明らかです。実際、両方の呼び出しはほとんど無視でき、どのアプリケーションにも大きな影響を与えるべきではありません。パフォーマンスの問題が発生している場合は、次の原因が考えられます。
y = sin(x); z = asin(y)
のようなものを呼んでいるなら、あなたは余分な不必要な呼び出しをしています。これはほんの一例ですが、もっと複雑な計算でも同様の効果が数学的に得られます。これらの点は、以下の解決策がC#での最適化に有効な道です。アプリケーションをプロファイリングするまで最適化を行うべきではないので、ボトルネックがどこにあるかを実際に知っていることに注意してください。これが最適化の唯一のルートではないことに注意してください。並列処理や異なるアルゴリズムの選択などのパスも有効です。
異なるソリューションのビットがありますが、this questionへの答えのようなものでC標準ライブラリをロードしようとすることができます。あなたはあなたに似ているthis questionをありますC.に速いASINアルゴリズムを書くことができ、これはまだ十分に速くはない場合
[DllImport("msvcrt.dll", EntryPoint="asin",
ExactSpelling=false, CharSet=CharSet.Unicode,
SetLastError=true)]
static extern double asin(double radians);
//calling the function
static void Main()
{
double x = asin(0);
}
:Windows上のC標準ライブラリはmsvcrt.dll
で、機能asin
が含まれている必要があります。また、このソリューションでもより高速な平方根関数を作成することができます。
角度を0に近づければ、テイラー級数近似を行うこともできます。また、角度を0に近づけることもできますが、もう少しトリッキーです。
ソフトリンクされたプロシージャは、本質的に同じコードに対するCLI呼び出しよりも速いのはなぜですか? – LutzL
私は、 'System.Math.Asin()'はマシンレベルではなく.NETランタイムによって解釈されていたと仮定しています。これが当てはまる場合は、Cのバージョンを少し速くする必要があります。そうでない場合、それらは同じものの周りにあるべきです。確かに知る唯一の方法はベンチマークです。同じパフォーマンスの場合、Cのカスタマイズされた実装は、C#の同じ実装よりも速くなければなりません。 OPはほとんどのケースよりもパフォーマンスが向上すると思われるので、Cの計算の一部を少しの余分なパフォーマンスを奪うことができるはずです。 – danielunderwood
CLIランタイムでは、IEEE 754で定義された数学関数への他の呼び出しがハードコードされているようにasinを呼び出すと、おそらく引数のチェックを除いて、それ以上解釈されないサブルーチンはないはずです。 – LutzL
おおよその答えが十分であれば、ルックアップテーブルの事前計算を考慮する必要があります。必要な数のエントリを使用して、必要な精度を得ることができます。 – RogerN
私はあまりに多くの追加メモリを使用することはできませんが、それでも良い近似が必要です。だから私は事前計算がうまくいかない。 – Nikita
asinを実装する方法が他にない場合は、近似関数が必要ですが、まだ適切ではありません – Nikita