0

私は物理モデリングに取り組んでいます。この場合のモデルは C で書かれています。モデルを呼び出すときは、通常 Ada から呼び出します。ただし、C でも記述しようとしましたが、Ada を使用すると、C を使用する場合よりもモデルの実行に約 30% 長い時間がかかることに気付きました!

誰かがなぜそうなのか説明できますか? Ada のほうが時間がかかるのはなぜですか。モデルを呼び出す Ada のメイン ルーチンは、モデルを呼び出し、約 100 要素の入力配列にデータを移動する以外は何もしないことを指摘しておきます。また、モデル自体もかなり計算量が多いため、30% の差は顕著です。

また、どちらの場合も同じコンパイル フラグが使用されます。メインルーチンが異なる言語で書かれている場合、違いを期待する必要があります。もしそうなら、なぜですか?

4

2 に答える 2

1

私たちがこれまでに持っている情報を考えると、どんな答えも推測です。しかし、ここに1つの推測があります:

一部のオペレーティングシステム(特に現時点ではDebianとその派生物)では、Gnatのデフォルトのインストールはデフォルトのgcc自体とは異なるバージョンのgcc(gcc-4.6)です。または、 Gnat Libre Edition 2012をダウンロードした場合は、システム独自のgccと一緒に独自のgccバージョンがインストールされます。

いずれの場合も、(Gnatmakeなどを使用して)結合されたAda / Cプログラムをビルドすると、純粋なCビルドとは異なるCコンパイラバージョンが使用された可能性があります。その場合、速度の違いは純粋に異なるCコンパイラバージョンによるものである可能性があります。

この仮説をテストするには、(a)使用しているコンパイラのバージョンを正確に調べて、質問に名前を付けます。-および(b)純粋なCバージョンを同じコンパイラバージョンでビルドするように強制します(たとえば、CC = gcc-4.6フラグを使用)-これが問題である場合、速度の違いはなくなります。

私の解決策(重要です)は、-enable-languages = ada、c、c ++を使用して、ソースから新しいgcc(現在4.7.2を使用しています)をビルドすることです。

ただし、他の解決策がある場合もあります。たとえば、同じ実際の動作を選択するには、異なるコンパイルフラグが必要になる場合があります。さまざまなCコンパイラバージョンのドキュメントは、いくつかの手がかりを提供するはずです。

または、しばらく待ってからアップグレードしてください。Debianは、Gnatリリースを他のgccと同期させる計画を立てています。非互換性(皮肉なことに、そのC部分と新しいGCCバージョンの間!)によってこのプロセスを妨げていた主要なAda / Cアプリが1つありましたが、そのアプリは現在更新されています。

于 2013-02-06T12:38:21.227 に答える
-1

いくつかの例がなければ、その理由は言えません。最も可能性の高い説明は、コードの翻訳は音訳であるということです。したがって、C の低レベルの特異性に合わせて最適化されている可能性が高く、その中にはエイリアシングの傾向があります。

Ada コンパイラは内部で参照渡しできるほどスマートなので、配列をコピーするべきではありません。C と Ada の間のインターフェイスは、速度を低下させる可能性がありますが、そうすべきではありません。


メインルーチンが異なる言語で書かれている場合、違いを期待する必要があります。もしそうなら、なぜですか?

それはルーチンの書き方に大きく依存します -- 実装依存の機能を利用するように書かれている場合、元の言語であっても同じことを行うことは[保証されていません].最も一般的なケースとして、ルーチンのタイミングが別の言語でも同じであると期待する必要があるとします。

したがって、あなたの質問は、実装の特異性に依存しない場合にのみ意味があります。

于 2013-02-05T14:54:31.190 に答える