- PR -

forループ

投稿者投稿内容
kosuke
常連さん
会議室デビュー日: 2005/03/24
投稿数: 48
投稿日時: 2005-04-01 20:51
質問です。
現在、画像処理プログラムを作成中です。
forループは処理が重いのでjamaやjampack等でpixelデータを扱おうと考えております。
こんな事が可能でしょうか?

for文ではなく行列のベクトル演算の感じでデータを扱いたいのです。

ハードウェアに実行させたら実行時間は早くなるみたいですけどどなたか情報を
ください。よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-04-02 00:39
Java はハードウェアに依存しないよう抽象化された実行環境ですのでハードウェアに特化したような処理は基本的に出来ません。
でも処理によっては JVM が最適化してお使いの CPU などの能力を活かすようコードを生成してくれる可能性があります。
kosuke
常連さん
会議室デビュー日: 2005/03/24
投稿数: 48
投稿日時: 2005-04-02 01:44
それではmatrixの処理を行うパッケージに渡してデータを扱うようにしたほうが
良いのでしょうか?

または、ほかの方法ご存知でしょうか?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-04-02 11:19
unibon です。こんにちわ。

JAMA や Jampack は知らなかったのですが、
http://math.nist.gov/javanumerics/
にあるものですよね。これらは (pure な) Java で書かれたライブラリーでしょうから、これを使うか使わないかは、結局は先人がコーディングしたものを使うか自分でコーディングするか、の違いでしかありません(動く環境は同じでコードが違うだけです)。

以下、余談になりますが、昔から思うのですが、画像処理(や音声処理)は、CPU パワーがいくらあっても足りません。要求も、昔は1枚処理するのに1日かかっても我慢できても、今はリアルタイムのフレームレートで処理したくなったりします。
これに応えるために、Java でやってて不満になったら、C/C++ でやってみる(Java からなら JNI で呼ぶことになる)。C/C++ でも速度が不満になったら、アセンブリー(言語)で書いてみる。それでもまだ不満なら、DSP とか GPU などの特化したハードウェアを使う、になります。どこかで打ち切らないと、どんどん深みにはまってしまいます。
kosuke
常連さん
会議室デビュー日: 2005/03/24
投稿数: 48
投稿日時: 2005-04-02 14:48
unibonさん、ありがとうございます。
実はcで記述していることを純粋なjavaに移行しようとしていた所なのです。
あまりjavaの知識が無かったために、予想以上の実行速度の遅さに驚いています。
JNIで呼んだほうが利口かなと思います。

デバイスを介したプログラムでも問題ないでしょうか?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-04-03 10:31
unibon です。こんにちわ。

引用:

kosukeさんの書き込み (2005-04-02 14:48) より:
実はcで記述していることを純粋なjavaに移行しようとしていた所なのです。
あまりjavaの知識が無かったために、予想以上の実行速度の遅さに驚いています。
JNIで呼んだほうが利口かなと思います。


別スレッドの、
「ピクセル値の取得」
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20059&forum=12
もあることに気づき、拝見しましたが、気づいた点としては、たとえば BufferedImage クラスの getRGB メソッドとかは、オーバーヘッドがあって速くないと思います。推測も入りますが、いきなり JNI などを検討する前に、Java でも Java なりに速くピクセルを扱う方法はいろいろありますので、Java2D やその他イメージライブラリーの使い方を検討されたほうが良いかもしれません。一般に、画像処理用(に限る訳ではありませんが)のライブラリーには、データーをひとつずつ扱う API と、ブロック・バルク単位で扱う API の両方を持っていることが多いです。たとえば、
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/2d/spec/j2d-bookTOC.doc.html
の中の RasterOp あたりのインターフェースを使うのかもしれません(使ったことはないので私は分かりませんが)。
ある程度オーバーヘッドをなくしたプログラムなら Java と C/C++ のプログラムの速度差は、そんなにないんじゃないでしょうか。(百倍は違わないかも、十倍位かも?)

引用:

kosukeさんの書き込み (2005-04-02 14:48) より:
デバイスを介したプログラムでも問題ないでしょうか?


「デバイス」という意味が良く分かりませんが、JNI を使えば Java の外に出てしまうので、C/C++でもアセンブリー(言語)でも、外部のボードやプロセッサーなどのデバイスへのアクセスでも、なんでもできます。
kosuke
常連さん
会議室デビュー日: 2005/03/24
投稿数: 48
投稿日時: 2005-04-03 10:40
ありがとうございます。
検討してみます。

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-04-03 11:36
私もJavaのグラフィックは詳しくないですが、
java.awt.image.VolatileImageというクラスがあり、
Windowsなら直接DirectXのVRAMとのやり取りが可能らしいです。
調べてみてはいかがでしょうか。

ちなみにJavaは遅いというイメージがありますが、
http://www001.upp.so-net.ne.jp/y_yutaka/labo/math_algo/calcbench.html
を参考にしてみてください。
演算処理に関しては、極端に遅いということはないと思われます。

スキルアップ/キャリアアップ(JOB@IT)