2009-07-21 13 views
2

私が取り組んでいるプロジェクト用のカスタム数学ライブラリを作成しようとしています。プロジェクトはC#で書かれており、C#が十分に速くなるかどうか少し気になります。ライブラリには、非常に大きなデータセットに適用される多数のカスタム数式と数式があります。シミュレーションと行列演算も同様に実行される(すなわち、モンテカルロシミュレーション)ので、高速でなければならない。数学ライブラリの開発

C++で数学ライブラリを作成し、この.dllをC#プロジェクト内で参照することを考えてください。私はそれが努力する価値があるかどうか疑問に思っていますか?

+0

ライブラリは何を処理しますか? – jkeys

+2

あなたは何種類の数学ライブラリをお探しですか?そこには、あなたがあまりにもインターフェイスすることができる非常に最適化された数学ライブラリがたくさんあります。 –

+0

また、あなたのライブラリーを最適化する必要がある理由についていくつかの情報を投稿することは、非常に役に立ちます。何度も何度も何度も呼び出されるのでしょうか、それとも非常に大きなデータセットを処理するか、あるいはその両方を処理しますか?それは質問に答えるのを助けるでしょう。 – Odd

答えて

6

は、が必要になるまで最適化されません」という一般的なルールは、C言語で書いて、後でコードを最適化する方に向いています。

しかし、最適化ですべての言語を別の言語で再実装する必要があるこの状況では、まずいくつかのテストを行います。 C#とC++の両方で期待される最もプロセッサ集約的な数学を使って小さなアプリケーションを作成し、時間を比較してC#が受け入れ可能かどうかを確認します。

1

どちらかといえば明確なことは少し難しいです。私はそれがあなたが始めたものか、あなたのプロジェクトの残りの部分が何を基盤にしているのかをC#に固執することをお勧めします。いくつかの標準的なデータセットを保管しておき、開発中にいくつかのベンチマークを確立してください。パフォーマンスが許容範囲を下回り、プロファイリングがC#の本質的な問題であると思われる場合は、その特定のニーズを解決するためのC++コンポーネントを作成してください。

5

C#で使用する場合は、C#で始めることもできます。あなたは、ポインタの争奪で保存するよりも管理されたコードで多くを買う。メモリとキャッシュの問題が心配な場合は、オブジェクトの代わりに型の配列を使用してください。これは、メモリのレイアウト方法をより詳細に制御します。

オプティマイザとJITコンパイラは、非効率性を補うのに十分なスピード以上のものを購入します。

1

C#やJavaなどのバイトコード言語を使用すると、ランタイム中のJITコンパイラでコードを最適化できることに注意してください。実際には、これはコードのランタイムパフォーマンスが時間の経過とともにより良いになることを意味します。マシンコードがコンパイル時に一度生成され、決して変更されないC++とは異なり、基礎となるJITコンパイラの改良とともに、C#コードのパフォーマンスが継続的に改善されます。

最近、JITコンパイラ技術に深刻な研究が行われています。今これを利用することは優れたアプローチです。

+0

.Net JITは現在、ホットスポットのようなモードを持っていないので、フレームワーク自体が改善されている場合にのみ発生します(現時点では可能ですが、これは新しいリリースごとの保証ではありません)。 Javaには、HotSpot VM(およびJRockitのようなもっと積極的なもの)があります。これにより、現在実行中のプロセスを、アプリケーションの実行中に再実行することができます。私はあなたが以前のスタイルの改善を話していると思っていますが、ちょうど明確にしたいと思っています。 – ShuggyCoUk

+0

右は、適応性のある実行時の再コンパイルではなく、以前のスタイルを参照していました。しかし、後者は容易に将来も来るだろう! –

0

数値プログラミングにC#を使用する理由の1つは、ネイティブコードとのインターフェイスがかなり簡単だということです。 C#と最新の.NETランタイムとJITコンパイラはかなり良いですが、高度に最適化されたネイティブコードを叩くことはできません。例えば、ここでは線形代数のために行ったことがあります。キー操作の実装を隠すオブジェクト指向クラスを作成してください。私にとっては、これは加算と乗算の関数/演算子でMatrixクラスとVectorクラスを作成することを意味していました。いくつかのmatrx-matrix製品を実行し、数多くの反復でかなり大きな行列(数千行から数百列まで)を使って製品を転置するアルゴリズムに遭遇したときに、処理が遅すぎました。インテルの数学カーネル・ライブラリー(dgemm)から高度に最適化された行列 - 行列乗算関数を呼び出すために行列乗算関数を再実装しました。これは私に20倍以上のスピードアップをもたらしました。さらに、このネイティブルーチンの不愉快なAPI(dgemmは13個以上のパラメータを取る!)は、マトリックスクラスのユーザから隠されていました。

あなたのライブラリにはC#を使用し、必要なときに最適化されたネイティブコードにドロップすることをお勧めします。

関連する問題