- ベストアンサー
JavaとCを連携させて高速計算を行う方法について
- JavaとCを連携させて高速な計算を行う方法について考えています。
- Cでの計算が速いという理由から、JavaアプリケーションからデータをもらってC(またはC++)で計算を行い、結果をJavaアプリケーションに引き渡す方法を検討しています。
- 使用する言語によって処理速度が変わるため、Javaからデータを引き渡す際にどの言語が最適なのかを知りたいです。また、それぞれの言語を選ぶ際の注意点も教えていただきたいです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
C が速いのは、コンパイルで、ソースコードからその動作環境の命令セット(機械語)までかなりチューニングされた状態で変換されるから。 その他の言語が遅いのは、インタプリタ式で逐一ソースコードを解釈してはそれに対応する処理を組み立てて実行する方式だからか、中間言語(ソースコードのように人間は判読できないが、どの命令セットにでも簡単な置き換えができる状態にまでしたもの)で各処理系・各動作環境に提供されるから、です。 Java は、中間言語の状態にできたり、環境によっては特定の命令セットでのコンパイル・アセンブルができるので、Java で一貫させる、というのができるなら、それが一番良い。python や R言語 を使わないといけないようなら、そこがボトルネックになって、どれだけ C言語でチューニングしても大した時間短縮は期待できない。
その他の回答 (5)
- ki073
- ベストアンサー率77% (491/634)
No.5です。 PythonやRubyでも実際にはそんなに遅くはないと思います。 重い処理には行列計算モジュールを使えば良いし、GSLなど多くの科学計算ライブラリを利用できるようになっています。 いろいろ試して決められたらよいと思います。 ScalaやHaskellはちょっとおもしろそうだと思ってます。 最近Haskellをやり始めました。数値計算向きではなさそうですが、純粋関数型プログラミングは目から鱗です。
お礼
ありがとうございます。 GSLはPythonやCythonでも使えるようですね。 色々と試して選んでいきたいと思います。
- ki073
- ベストアンサー率77% (491/634)
No.2,4です。 ちょっと訂正(汗;;) プロライラ -> プロファイラ それと JythonはPython -> Javaのようですね、こちらも訂正。 テキストデータを読み込み、その中からデータを抽出して、数値計算をすることを主としてやっています。いろいろ考えてRubyを選択したのですが、当時日本ではPythonが一般的ではなく選択肢に入っていませんでした。またScalaも Rubyを使っていて思うのは、動的型付変数なのが特長でもあり、欠点でもあると感じています。変数に何でも入れられるのでお手軽ですが、速度面で遅くなってしまうのと大きなプログラムになるとミスがでやすいことが気になります。Pythonも同じです。 新しいプログラミング言語では、型推論可能な静的型付変数、コンパイラではあるが、インタープリタとても使えるものが多くなっています。Scala, Swift, Haskellなどが該当します。いずれもJava程度の速度が期待できます。 ちょっと余談ですが、動的型付変数のErlangも使ってみました、コンパイラであるのですが、動的型付変数が速度面でかなり足をひっぱっているようでした。
お礼
ありがとうございます。 性能解析するためのプロファイラというものがあるのですね。 聞いたことがない言葉でしたので何の誤植かわかりませんでした。 動的型付変数の言語は速度を考えると敬遠したくなります。 Pythonでも変数型を固定することができればいいのですが。
- ki073
- ベストアンサー率77% (491/634)
No.2です。 ちょっと補足 JavaとCのベンチマークがあると思いますが、印象として数倍遅くなる程度です。高速な部類にはいります。 Javaで構築したPythonやRubyなどがあります。使ったことは無いですが、Javaとの相性は良いようです。一時は盛り上がっていましたが、先細りの感もあり本格的に使うにはちょっと心配。 スクリプト言語で数値計算する場合には心配するほどは遅くなりません。普通にループを書くとビックリするくらい遅いのですが、行列計算用のモジュールがあります。それを使うとJava程度の速度はでます。私自身C/C++で書いているのは、行列計算に馴染まないもの、並列実行、GPUで実行するものに限定されます。かなりの高速化を狙ったものだけです。 それと呼び出しのオーバーヘッドが問題となることはあまりないと思います。プロライラを使ってみればわかりますが、ボトルネックになるところはホンノ数行だったりします。そこを丸ごと書き換えれば良いわけです。
お礼
ありがとうございます。 やはり実際に自分で色々と試してみないと分からないようですね。 > プロライラ ??
- wormhole
- ベストアンサー率28% (1626/5665)
C~Java間のデータのやりとりはどのようにされるつもりでしょうか? ・JNIやJNA ・CORBAなどのRPC ・ファイル ・その他 場合によっては、そのデータのやりとり部分で処理コストがかかって演算早くなった分と差引0などになることもありますけど。
お礼
ありがとうございます。 > C~Java間のデータのやりとりはどのようにされるつもりでしょうか? JNIやJNAあたりと考えていたのですが。 > 場合によっては、そのデータのやりとり部分で処理コストがかかって演算> 早くなった分と差引0などになることもありますけど。 そういうものなのですね。
- ki073
- ベストアンサー率77% (491/634)
Javaは結構速いのでJavaだけで押し通すということも考えられますが、 PythonやRを利用するとなると速度が必要な共通部分はCやC++で書くという事でしょうか? 私自身は速度の都合でCやC++を場合にはSwigを使っています。主にRubyからC++を利用していますが、C++のクラスを簡単にRubyから利用できるので重宝しています。 SwigはPytonやJava,Rなど多くの言語からC/C++呼出せますので検討されてはいかがでしょうか。 http://www.swig.org Rは多くの言語から利用できるインターフェースが存在します。また最悪はパイプでつないで利用することも可能です。 http://www.okadajp.org/RWiki/?Rとインターフェースのあるアプリとサービス Python -> Javaは難しそうに思います。 私の使い方 Ruby - (Swig) -> C++ Ruby --> R
お礼
ありがとうございます。 > PythonやRを利用するとなると速度が必要な共通部分はCやC++で書くという事でしょうか? 絶対に速度が必要ならば、コアの部分はCやC++で書いた方がいいのだろうな、と思っているわけです。 ただ色々調べていますと、速度がそこまで必要でなければ最初から最後までPythonで押し通すという方法もあるようでして、この辺りはまだハッキリしておりません。 > Python -> Javaは難しそうに思います。 Jythonというやつがあるようですが、これは Java -> Python はできても Python -> Java の方は難があるということでしょうか。
お礼
ありがとうございます。 おかげさまでスピードについてよく理解することができました。 > 環境によっては特定の命令セットでのコンパイル・アセンブルができる ここをもう少し詳しく知るためには、どのサイトを参照すればよいでしょうか?