私はコードの遅い領域のいくつかのeprofileテストを実行してきました。これは、Visual Studio2008および.NET2(完全にパッチが適用されている)を使用した場合です。私の計算の約32%はHaversine式で使用されています。これには、2つのサイン、2つのコサイン、平方根、およびアークサインが必要です。これらはすべて標準の.NET Mathライブラリ(Math.Sin、Math.Asin、Math.Sqrt)を使用します。余弦定理を簡単にキャッシュすることができました。その結果、Haversine関数が約25〜30%高速化されました。
プロファイルには、__ CIasin_pentium4と__CIasinが表示されていますが、スタックダンプなど、ユーザーが投稿したものを除いて、どちらもGoogleではあまり見つかりません。pentium4バリアントは、約2倍のサンプル(包括的および排他的の両方)を取得します。これはアークサインだと思いますが、サインよりもはるかに高価ですか?2倍の数が計算されますが、プロファイルに正弦の兆候はありません。
これらの関数は両方とも正弦波ですか、それとも一方は正弦波ですか?そうでない場合、それらは何を表していますか?
はい、私はインターネットやここでファストサインに関するさまざまな記事や投稿を見てきました。ルックアップテーブルや切り捨てられたテイラー級数ではなく、計算された正弦の精度が本当に必要です。私はHaversineを使用して、地球の表面上の距離を計算および/または比較しています。10mの精度(私のアプリの最小IMHO)は、約1/640000ラジアンに相当します。
速度についての1つの考えは、三角関数公式を多重化することです。これにより、より多くのtrig関数が生成されますが、それらは個々のエンドポイントのみに依存するようになるため、キャッシュ可能になります。もう1つは、比較のためにアークサインと平方根をアンラップすることです。後者には改善の余地がたくさんあると思いますが、現時点では、処理に何がかかっているのか、そして__CIasin関数が何を表しているのかを正確に理解しようとしています。