JRubyでswingなんぞを
さて、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.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についての発表があり興味深かった。
やっぱり画像処理は面白い。