1

私はコードの遅い領域のいくつかの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関数が何を表しているのかを正確に理解しようとしています。

4

2 に答える 2

1

Pentium FPU には正弦と余弦 (fsin と fcos) のネイティブ命令があるように見えますが、アークサインにはありません。したがって、私が見ている __CIasin 関数は、おそらくアークサインの .NET 実装であり、テイラー級数を使用していると理解しています。これは速度の大きな違いを説明しているため、asin は表示されますが、sin は表示されません。(または cos または sqrt - これらもネイティブ関数です)。

私はずっと前に x86 FPU を直接コーディングしました。ずっと前に、それは 8087 だったに違いないと思います - いずれにせよ、当時存在していた唯一の三角波は部分接線でした!

したがって、最適化の次の作業は、可能であれば、Haversine からアークサインと平方根をアンラップすることです。結果は単純な大小比較 (ソートなど) に使用されます。「固定」値と比較します。どちらの場合も、これらをアンラップできるはずです。例えば。固定値は square( sin( fixed ) ) になり、sqrt 内にあったものと比較されます。

トリガー ID は最適化に役立つと思いますが、間違いなくコードが複雑になり、エラーが発生する可能性があります。

于 2010-10-21T18:35:22.720 に答える
0

はい、間違いなく平方根とアークサインをアンラップします。逆三角関数は通常FPUに実装されているため、逆三角関数はほとんどの場合、前方の関数よりも低速です。

于 2010-11-08T20:27:08.640 に答える