2016-12-01 10 views
-3

私のプロジェクトでは、多くの時間をASINで計算する必要があります。 C#では時間がかかります。ArcSinの高速実装または近似C#

私は、System名前空間

から質問がC#で速く阿機能を実装する方法があるMath.Asin()を使用します。

どんな近似アルゴリズムや、より高速に動作する別の実装ですか?

+1

おおよその答えが十分であれば、ルックアップテーブルの事前計算を考慮する必要があります。必要な数のエントリを使用して、必要な精度を得ることができます。 – RogerN

+0

私はあまりに多くの追加メモリを使用することはできませんが、それでも良い近似が必要です。だから私は事前計算がうまくいかない。 – Nikita

+0

asinを実装する方法が他にない場合は、近似関数が必要ですが、まだ適切ではありません – Nikita

答えて

1

テストのコメントとベンチマークで議論が行われた後、私が下で示した解決策が実際にSystem.Math.Asin()のパフォーマンスを改善するつもりはないことは明らかです。実際、両方の呼び出しはほとんど無視でき、どのアプリケーションにも大きな影響を与えるべきではありません。パフォーマンスの問題が発生している場合は、次の原因が考えられます。

  1. arcsinコールは実際にボトルネックではありません。ボトルネックを確実に判断するには、アプリケーションのプロファイルを作成する必要があります。時期尚早の最適化は一般的な間違いであり、多くの無駄な時間につながる可能性があります。
  2. あなたは関数を何度も呼び出しています。関数を何回も呼び出す正当な理由があるかもしれませんが、呼び出しはより高いレベルとして最適化される可能性があります。考えられる解決方法は、並列呼び出しを使用するか、呼び出しを減らすために操作の順序を変更することです。もしあなたがy = sin(x); z = asin(y)のようなものを呼んでいるなら、あなたは余分な不必要な呼び出しをしています。これはほんの一例ですが、もっと複雑な計算でも同様の効果が数学的に得られます。
  3. あなたは、あなたがしてはいけないはずのどこかの関数を呼び出しています。たとえば、GUIやレンダリングスレッドで計算を実行しようとすると、パフォーマンスの問題にぶつかり、応答性が低下します。これは一般的な設計ミスであり、計算はGUIスレッドで行うべきではないことに注意してください。
  4. あなたのユースケースは実現できません。ライブデータ変換やビジュアライゼーションのような作業を行っている場合、リアルタイムで処理できるデータ量の上限があります。これはハードウェアに依存しており、より多くの処理能力を備えたどこかで計算をオフロードする以外にはあまり効果がありません。このような場合は、クラウドコンピューティングが便利な場所です。

これらの点は、以下の解決策が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に近づけることもできますが、もう少しトリッキーです。

+0

ソフトリンクされたプロシージャは、本質的に同じコードに対するCLI呼び出しよりも速いのはなぜですか? – LutzL

+0

私は、 'System.Math.Asin()'はマシンレベルではなく.NETランタイムによって解釈されていたと仮定しています。これが当てはまる場合は、Cのバージョンを少し速くする必要があります。そうでない場合、それらは同じものの周りにあるべきです。確かに知る唯一の方法はベンチマークです。同じパフォーマンスの場合、Cのカスタマイズされた実装は、C#の同じ実装よりも速くなければなりません。 OPはほとんどのケースよりもパフォーマンスが向上すると思われるので、Cの計算の一部を少しの余分なパフォーマンスを奪うことができるはずです。 – danielunderwood

+0

CLIランタイムでは、IEEE 754で定義された数学関数への他の呼び出しがハードコードされているようにasinを呼び出すと、おそらく引数のチェックを除いて、それ以上解釈されないサブルーチンはないはずです。 – LutzL

関連する問題