読者です 読者をやめる 読者になる 読者になる

まめ畑

ゆるゆると書いていきます

JRubyでswingなんぞを

JRuby

さて、JRubyで遊んでいるんですが速度的なところをごくごく簡単に計ってみた。
The page you were looking for doesn't exist (404)を参考にさせていただきました。
多謝。


とりあえず、Javaでこんな感じのコード

import java.util.ArrayList;

public class Test{
	public static void main(String[] args){

		int sum = 0;
		long start = System.currentTimeMillis();

		ArrayList hoge = new ArrayList();


		for(int i = 0; i<10000; i++){
			hoge.add(i);
		}

		for(Object fuga : hoge.toArray()){
			sum += (Integer)fuga;
		}

		long end = System.currentTimeMillis();

		System.out.println("合計: " + sum);
		System.out.println("時間: " + (end-start)/1000.0 + " s");
	}
}


JRuby的に

require 'java'
require 'time'
import 'java.util.ArrayList'

sum = 0;
startTime = Time.now

hoge = ArrayList.new

0.upto(9999){|i|
	hoge.add i
}

hoge.each{|fuga|
	sum += fuga.to_i
}

endTime = Time.now

puts "合計: " + sum.to_s
puts "時間: " + (endTime-startTime).to_s + " s"


となる。
で。Rubyだけで簡単に書いてみたら。

require 'time'

sum = 0;
startTime = Time.now

hoge = []

0.upto(9999){|i|
	hoge << i
}

hoge.each{|fuga|
	sum += fuga.to_i
}

endTime = Time.now

puts "合計: " + sum.to_s
puts "時間: " + (endTime-startTime).to_s + " s"

となってみる。


で、計測。
5回の平均。
JRubyにオプションはなし。

JRuby: 1.031s
Java: 0.016s
Ruby: 0.015s

うーん。遅い・・・。
jruby.compile.fastestオプションをつけてみる。
これは、やる夫が言うには

jruby.compile.fastestオプションは、JITコンパイルでRubyには必要だけど、Javaバイトコードに不要な処理をスキップするお......

とのこと。

  • J-Djruby.compile.fastest=trueをjrubyにつけて実行。

結果: 0.86s

うーん。
こんなもんなのかな。
JRubyのコンパイル時間がオーバヘッドになっているのか??

というころでswing

swingもいけるのでやってみる。

require 'java'

import 'javax.swing.JFrame'
import 'javax.swing.JButton'
import 'javax.swing.JTextField'
import 'javax.swing.JPanel'
import 'java.awt.BorderLayout'



class ButtonAction
  include java.awt.event.ActionListener

  def initialize(text)
	 @text = text
  end
  def actionPerformed(evt)
    @text.setText("Click")
  end
end


frame = JFrame.new("HOGE")
button = JButton.new("Click!!!")
text = JTextField.new(10)

button.add_action_listener(ButtonAction.new(text))

panel = JPanel.new
panel.add text
panel.add button
frame.getContentPane.add(panel, BorderLayout::CENTER)
frame.setDefaultCloseOperation(JFrame::EXIT_ON_CLOSE)
frame.pack
frame.visible = true

書きやすい!
Javaチック。


Rubyの文化に合うように、以下のようなメソッド名の互換があるとのこと。
例: setDefaultCloseOperation -> set_default_close_operation


あと、少し困ったのが「include java.awt.event.ActionListener」のところ。
こいつはimportだとエラーはくし、java.awt.event.ActionListenerを'で囲むんでもエラーが出る。
なんでだろう?
探し方が悪いのか原因がわからない。
これは要調査のもの。

実行した結果


上が起動画面で、ボタンをクリックするとしたのようになる
だけ。


jirbからも簡単にできるのがいい。
jFrame.newとした時に、その時のFrameのプロパティ値が表示されるのでどうなっているかがわかりやすい。

今日の1000spで

今日の1000spでJRubyとprocessingについての発表があり興味深かった。
やっぱり画像処理は面白い。
D