日曜日 6 08, 2008

JRuby1.1 performance : single thread/multi threads vs. cRuby1.86 / 1.9

JRubyのパフォーマンス:cRuby1.86 / 1.9 とのシングル/マルチスレッドでの比較

[Summary] Koichiro and Naoto,  who are JRuby "Japanese leaders", wrote out an article with results of   benchmarking test of single/multi thread performance for JRuby1.1 vs. cRuby 1.8.6 / 1.9 !  To summarize, CMT technology with Sun SPARC Enterprise T5220 contributes throughput of multi thread processiong for JRuby. Great Job, thanks Koichiro and Naoto!!

(Translate to English)

うっかりして見落としていました。"Japanese JRuby Guy" こと大場光一郎&高井直人コンビの非常に興味深い記事が”まるごとRuby! Vol.1"(インプレスジャパン刊)に掲載されました。目次によれば、

■特集2 輝く2つのRuby
――最先端Ruby 1.9と高性能JRuby 1.1
 Part 1 JRuby 1.1の性能測定も実施!
JavaとRubyの融合世界! JRuby入門 
[大場光一郎/高井直人]
 Part 2 速さも機能も段違い
ここがスゴい! 新世代Ruby 1.9
[後藤謙太郎]

となっています。”JRubyの性能”として章の中で、非常に興味深いベンチマークテストと考察を行っています。主なところを書き出すと以下の通り。

JRuby 1.1では、少なくともRuby 1.8.6と同等かそれよりも速いくらいの実行性能を得られます。項目によっては、Rubyのバージョン 1.9.0よりも速いものもでてきています。

いやぁ〜、ここまで言うとは。ちょうど、近々来日するCharles Nutter と本日、チャットをしていたのですが、この話をしたら、非常に喜んでいて、向こうで鼻息荒くしている様子も感じとれました(本当か?)。 ますます、ヒートアップするか? Charlie vs. Ko1 の”スピード競争”!!(「若気の至り」という話もありますが。。(某氏曰く))

Ruby と JRubyのベンチマーキング

多体問題を解くプログラムを実行した際の性能を Ruby処理系ごとに比較してみましょう。それぞれの処理系には得意な処理と不得意な処理があり、このベンチマークテストが全体の傾向を決定するわけではありませんが、JRubyが十分速い場合があるということがわかります。図5を見てください。このケースでは、JRuby RC3の実行性能は、Ruby1.8.6 よりもずっと優れています。さらに、Ruby 1.9.0 よりも性能が良いという結果になっています。

図5がお見せできなくて残念ですが(掲載誌を購入してください(笑))、たしかにこのケースでは1.9.0 といい勝負をしているようです。さて、次にいよいよ、マルチコアでの勝負!!

マルチコア環境での性能

JRuby が他の Ruby処理系よりも圧倒的に優れているのが、マルチコアプロセッサ環境の性能です。JRuby では、Javaのスレッド機構をうまく利用しているので、処理系全体をロックすることなしにネイティブスレッドでの並列実行が可能になっています。

.....(中略).....

テスト用サーバ機器として「Sun SPARC Enterprise T5220」を用意しました。このサーバは 8 コアのUltraSPARC T2プロセッサを搭載し、同時に64スレッドを実行できます。

なんと、T2のマシンでやるとは!!スバラシイ!!


......(中略).....

興味深いのは、シングルスレッドのときにはRuby 1.9 のほうがJRuby よりも速く処理が終了しているのに対して、スレッド数が増えるにつれて JRubyのほうがより短時間で処理が完了している点です。

JRubyであればスレッド数を増やしていくことでマルチコアのCPU を搭載したマシンの性能をあますことなく活用できます。今後、ますますマルチコアプロセッサを搭載したマシンが利用されていくことを考えると、JRuby が活躍する場面は増えてくるのかもしれません。

掲載されているグラフを見ると、コア数(この場合は8)までは、非常に良く、性能が伸びています。その後、CMT特有のマルチスレッディングに関しては、JRuby の今後のエンハンスによって性能が伸びていくことになるのでしょう。今回、テストに使われたソースは次の通りです。

require 'benchmark'

def fib n
  n < 2 ? n : fib(n - 1) + fib(n - 2)
end

Benchmark.bm do |x|
  for i in 1..64 do
    x.report("%2d threads" % i) do
      ts = []
      i.times do
        ts << Thread.fork do
          (64 / i).times do
            fib 10
          end
        end
      end
      ts.each{|t| t.join }
    end
  end
end

Thread.fork にて、スレッドを新規に作成させています。

もう少し細かく、また、他の事項についても紹介したいところですが、そこは掲載誌をご覧ください。ともあれ、大場さん、高井さん、お疲れさまでした!!




土曜日 5 10, 2008

(for Windows user ) The easiest way to use Ruby on Rails with MySQL : NetBeans6.1 !

Windows ユーザのための「Ruby on Rails をMySQLと共に、最も簡単にインストール/開発環境構築」編

[Summary] Many of developers seems to want to try "Ruby on Rails with MySQL". For windows users, there is the easiest way ---- just install "NetBeans IDE 6.1 with Glassfish and MySQL Bundle". Enjoy RoR life!! :-)

(Translate to English)

片貝さんがMac版のを紹介済みですので、未だに日本人の大部分を占めるWindowsユーザのため、MySQL/GlassFishバンドルインストーラ付属NetBeans6.1をWindows XP にインストールしてみました。

 

step1

インストーラーをスタート


step2 

GlassFish の管理passwordを入れ


step3 

MySQLのroot passwordを入れると


step5 

インストールが開始され、何事もなく終了

 

step7

 WindowsのメニューにMySQLも入ります。

 

MySQL 

次にNetBeansを立ち上げ、"Services"タグからMySQLをスタート

 

GlassFish 

同様にGlassFishもスタートさせることが可能


MySQL 

mysqladmin コマンドで動作を確認


GlassFish 

次に http://localhost:8080 でglassfish が動作しているのを確認


step8

NetBeansからはこのように確認できます。


Ruby_C

さて、RoRの話に戻ります。NetBeans6.1ではRoRを"File"メニューの"New Project"から選んで簡単に作成できるわけですが、途中、上の図のようにRubyインタプリタを選ぶ箇所があります。私の環境では、MRIこと(c)Ruby とJRuby の両方を選べるようにしてありますが、NetBeans では初めからJRubyインタプリタがついてきて、別個にRubyやRails環境を構築����る必要はありません。


mysql

Database を選択する箇所では、MySQLがそのまま選択できるのが、とても幸せです。つまり、Ruby同様、MySQL環境を別個に構築する必要がないわけです。


openssl

ただし、ディフォルトのJRubyの場合、画面のようにOpenSSL のインストールを忘れないでください。


password

一連の入力が終わると、Railsのファイルが一気に生成されますが、database.yml のソースが開かれます。ここでpasswordフィールドに、MySQLインストール時に設定したpasswordをセットする必要があるので(mysqlのrootユーザで利用する場合)、必要に応じてソースを修正します。

 

run_normal

run してみましょう。passwordが正しくセットされ、MySQLにきちんと接続できれば、環境情報を取れるはずです。

 

run_error

一方、passwordや設定が何か間違っていると、上の図のようにエラーメッセージの嵐になります。

 

NetBeans6.1 の(MySQL + glassfish)バンドル版は、(多くの場合)Ruby, Rails, MySQL を今まで別々にインストールしていた手間を考えると、RoRを始めるのがすばらしく簡単になっています。もちろん、既にcRubyの環境を持っていても、問題なく環境を取り込めます。

 流行の"Ruby on Rails"を自宅でこっそりと動かしてみたい方も、是非、お試しください!

 


金曜日 5 09, 2008

Tim said "I love Ruby/JRuby" at the interview by Japanese media

"やっぱり好きなのはRuby/JRuby" by Tim Bray

 

[Summary] Tim Bray was interviewed by Japanese media. The article is here ( yes, it is written in Japanese ! )

(Translate to English)

マイコミジャーナルより。Tim 曰く、

コミュニティはテクノロジを評価する上で非常に重要なポイントだと考えている。RubyおよびRailsのコミュニティは非常に大きく、そしてフレンドリーだ。Rubyを始めようとしたときや、何かわからないことがあったときには、すぐに良いアドバイスをくれる

 
 

水曜日 5 07, 2008

RFacebook bugs : Error messages from Facebook with Ruby on Rails

Ruby on Railsからのエラーメッセージ@Facebook

[Summary] I happened to see bugs at Facebook. It is really built with Ruby on Rails. This is an evidence :-)

(Translate to English)

Facebook はちゃんとRuby on Rails で動いています。誰でもわかります。バグメッセージが、

Please report RFacebook bugs here.

 ですから。。証拠は下のスクリーンショット。

 

matz and Jruby
 

エラーだけを表示すると以下の通り:

undefined local variable or method `request' for #

attribute_methods.rb:205 in method_missing_without_original
/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:205:in `method_missing_without_original'
acts_as_modified.rb:212 in method_missing
/vendor/plugins/acts_as_modified/lib/acts_as_modified.rb:212:in `method_missing'
application_helper.rb:124 in is_https?
/app/helpers/application_helper.rb:124:in `is_https?'
application_helper.rb:59 in profile_image_path_for_user
/app/helpers/application_helper.rb:59:in `profile_image_path_for_user'
user.rb:1216 in set_facebook_profile_box
/app/models/user.rb:1216:in `set_facebook_profile_box'
facebook_controller.rb:13 in index
/app/controllers/facebook_controller.rb:13:in `index'
base.rb:1158 in send
/vendor/rails/actionpack/lib/action_controller/base.rb:1158:in `send'
base.rb:1158 in perform_action_without_filters
/vendor/rails/actionpack/lib/action_controller/base.rb:1158:in `perform_action_without_filters'
filters.rb:697 in call_filters
/vendor/rails/actionpack/lib/action_controller/filters.rb:697:in `call_filters'
filters.rb:725 in run_before_filters
/vendor/rails/actionpack/lib/action_controller/filters.rb:725:in `run_before_filters'
benchmark.rb:293 in measure
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
filters.rb:483 in call
/vendor/rails/actionpack/lib/action_controller/filters.rb:483:in `call'
filters.rb:483 in call
/vendor/rails/actionpack/lib/action_controller/filters.rb:483:in `call'
filters.rb:722 in run_before_filters
/vendor/rails/actionpack/lib/action_controller/filters.rb:722:in `run_before_filters'
filters.rb:695 in call_filters
/vendor/rails/actionpack/lib/action_controller/filters.rb:695:in `call_filters'
filters.rb:689 in perform_action_without_benchmark
/vendor/rails/actionpack/lib/action_controller/filters.rb:689:in `perform_action_without_benchmark'
benchmarking.rb:68 in perform_action_without_rescue
/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
benchmark.rb:293 in measure
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
benchmarking.rb:68 in perform_action_without_rescue
/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
rescue.rb:199 in perform_action_without_caching
/vendor/rails/actionpack/lib/action_controller/rescue.rb:199:in `perform_action_without_caching'
caching.rb:678 in perform_action_without_apache_combined
/vendor/rails/actionpack/lib/action_controller/caching.rb:678:in `perform_action_without_apache_combined'
query_cache.rb:33 in cache
/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:33:in `cache'
query_cache.rb:8 in cache
/vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in `cache'
caching.rb:677 in perform_action_without_apache_combined
/vendor/rails/actionpack/lib/action_controller/caching.rb:677:in `perform_action_without_apache_combined'
response_management_additions.rb:86 in perform_action
/lib/response_management_additions.rb:86:in `perform_action'
base.rb:524 in send
/vendor/rails/actionpack/lib/action_controller/base.rb:524:in `send'
base.rb:524 in process_without_filters
/vendor/rails/actionpack/lib/action_controller/base.rb:524:in `process_without_filters'
filters.rb:685 in process_without_session_management_support
/vendor/rails/actionpack/lib/action_controller/filters.rb:685:in `process_without_session_management_support'
session_management.rb:123 in process
/vendor/rails/actionpack/lib/action_controller/session_management.rb:123:in `process'
base.rb:388 in process
/vendor/rails/actionpack/lib/action_controller/base.rb:388:in `process'
dispatcher.rb:171 in handle_request
/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:171:in `handle_request'
dispatcher.rb:115 in dispatch
/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:115:in `dispatch'
dispatcher.rb:126 in dispatch_cgi
/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:126:in `dispatch_cgi'
dispatcher.rb:9 in dispatch
/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:9:in `dispatch'
rails.rb:76 in process
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel/rails.rb:76:in `process'
rails.rb:74 in synchronize
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel/rails.rb:74:in `synchronize'
rails.rb:74 in process
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel/rails.rb:74:in `process'
mongrel.rb:159 in process_client
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:159:in `process_client'
mongrel.rb:158 in each
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:158:in `each'
mongrel.rb:158 in process_client
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:158:in `process_client'
mongrel.rb:285 in run
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:285:in `run'
mongrel.rb:285 in initialize
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:285:in `initialize'
mongrel.rb:285 in new
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:285:in `new'
mongrel.rb:285 in run
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:285:in `run'
mongrel.rb:268 in initialize
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:268:in `initialize'
mongrel.rb:268 in new
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:268:in `new'
mongrel.rb:268 in run
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel.rb:268:in `run'
configurator.rb:282 in run
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel/configurator.rb:282:in `run'
configurator.rb:281 in each
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel/configurator.rb:281:in `each'
configurator.rb:281 in run
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel/configurator.rb:281:in `run'
mongrel_rails:128 in run
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/mongrel_rails:128:in `run'
command.rb:212 in run
/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.3/bin/../lib/mongrel/command.rb:212:in `run'

mongrel_rails:19 in load
/usr/bin/mongrel_rails:19:in `load'

 

火曜日 3 04, 2008

Guys for another Dynamic Language --- Sun for Python!



2人のPythonエンジニアがSunに入社!!

[Summary] Frank Wierzbicki of the Jython project and Ted Leung of OSAF (and a bunch of other stuff) to help with the Python story at Sun. JRuby, MySQL, then Jython/Python!!

(Translate to English)


JRubyに続いて、今度はJython/Python のエンジニアがSunに集合です。

Sunの"The Official Site for Breaking News and the Latest Information from Sun"に書いてありますが、Pythonの中心人物であるTed LeungJython の中心人物のFrank WierzbickiがSun に3月3日付で入社しましたっ!!

各々のblogでそのあたりを述べています。Ted はここ。Frank はここ

新しい波である、Dynamic Language にSunは本気であることがご理解いただけると思います。先日のMySQLの買収完了に続き、新しい時代のシステム・アーキテクチャに果敢に挑戦するSunです。Javaという技術を生かしながら。

About

Takashi Shitamichi(下道高志)

Chief Technologist
GSE Japan, Sun Microsystems

Spokes Person/Secretary@SIG-Japan,Liberty Alliance
Chair of Edu-committee, ISACA Tokyo
CISA,CISM
中小企業診断士

Search

Archives
« 4月 2014
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今日