11

私はJavaで画像処理アプリケーションを開発してきましたが、最近VALAに興味を持っています。その理由は、アプリケーションのパフォーマンスを向上させることができると信じているためです(JavaでC / C ++ブリッジを使用するとパフォーマンスが低下するように思われるため、主にC / C ++ライブラリとの相互接続に懸念があります)

背景(私が知っていること):

  • VALAはCコードに変換されてから、ネイティブマシンコードにコンパイルされます。
  • AOT(Java / Mono C#)は、ネイティブマシンコードも生成できます(VMを使用する代わりに、ランタイムバンドルが必要です)。
  • 場合によっては、VMを使用すると、ネイティブマシンコードよりもさらに高速になることがあります(JITコンパイラを介して最適化できるため)。
  • 消耗品のC/C ++ライブラリは、VALAを使用して作成できます。

私の頭の周りに何かが起こっていて、答えが見つかりません:

  1. C / C ++の消耗品ライブラリはAOTコンパイラを使用して作成できますか?(私はそうは思わない)。
  2. 生成されたAOTバイナリには、まだブリッジのパフォーマンスの問題がありますか?(私はそうだと思います)。
  3. VALAでC/C ++ライブラリを呼び出すと、Cから呼び出すのと同じパフォーマンスが得られますか?(そうだと思います)。

何か洞察はありますか?

4

1 に答える 1

6

1. C / C ++の消耗品ライブラリはAOTコンパイラを使用して作成できますか?

ヘッダーがなく、AOTコンパイラが作成しているのは厳密にはCクラスではなく、マシンコードであるため、これは不可能なはずです。

(補足:JavaクラスはC / C ++内で呼び出すことができますが、AOTコンパイラーは単一のバイナリファイルを生成するため、そのファイルの外部からJavaクラスにアクセスすることはできないと確信しています)。

回答:いいえ

2.生成されたAOTバイナリには、まだブリッジのパフォーマンスの問題がありますか?

まず、知っておく必要があります。ブリッジ(JNI、javacppなど)を使用してJavaからC / C ++クラスを呼び出すと、常にパフォーマンスが低下する場合はどうでしょうか。

## java@irc.freenode.netの「W_」によると:

それはあなたがそれをどのように呼んでいるかに依存します(例えば、引数を変換する必要があるかどうかなど)。引数や戻り型の変換を行わずにライブラリ関数を呼び出すだけで、Cアプリの場合と同じように時間がかかることはありません。

しかし、私はOpenCVライブラリのブリッジとしてJavaCVを使用しているので、いくつかのタイプのオブジェクトを使用します。上記が当てはまる場合は、パフォーマンスに影響を与えるはずです。

したがって、AOTコンパイルによって実行が少し高速化される可能性があるが、それでもブリッジを通過して型変換を実行する必要があるのは論理的かもしれません。

回答:はい(ただし、少し速い場合があります)

3.VALAでC/C ++ライブラリを呼び出すと、Cから呼び出すのと同じパフォーマンスが得られますか?

直接Cに変換するので、理由がわかりません。これは、#vala@irc.gimp.orgの「nemequ」によってサポートされていました。

はい、ほとんどです。valaには一時変数を使用する習慣がありますが、それはほとんどのコンパイラーが簡単に最適化できる種類のものです。gccを使用している場合は、-O2を渡すと、問題がないはずです。

回答:はい

それでも、なぜ「誰か」が私の質問を閉じることに投票したのかわかりません。彼/彼女はそれについてコメントすることさえしませんでした。これらの質問/回答は(pstがコメントしたように)十分に建設的であり、VALAまたはAOTコンパイラーに不慣れな他の人々に役立つかもしれないと思います。

私の結論が正しくない場合は、私を訂正してください。

于 2012-01-17T03:02:57.800 に答える