やる夫で学ぶJRuby最適化

| | コメント(0)

日本Reject会議2008の発表資料を公開します。


          ____
       / \  /\  キリッ
.     / (ー)  (ー)\
    /   ⌒(__人__)⌒ \
    |      |r┬-|    |  Ruby 1.9はクリスマス前にリリースします
     \     `ー'´   /
    ノ            \
  /´               ヽ
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/    だっておwwwwwwww
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l  バンバン
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


      +____
     /⌒  ⌒\
   /( ⌒)  (⌒)\ +
  /::::::⌒(__人__)⌒::::: \   いつリリースされるか分からない1.9よりも、
  |     |r┬-|     |  JRubyでエンタープライズRubyだお!
  \      `ー'´     /  + 
,,.....イ.ヽヽ、___ ーーノ゙-、.
:   |  '; \_____ ノ.| ヽ i
    |  \/゙(__)\,|  i |
    >   ヽ. ハ  |   ||

       ____
     /⌒  ⌒\
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \   さっそくベンチマークをとってみるお!
  |     |r┬-|     |
  \      `ー'´     /

      ____
     /\  /\
   /( ●)  (●)\
  / :::::⌒(__人__)⌒:::::\   ruby-benchmark-suiteのbm_nbody.rbを3回実行し、
  |     |r┬-|       |  一番良い値を採用するお!
  \     ` ー'´     /


yaruo@vip% time ruby bm_nbody.rb 10000
1.04s user 0.02s system 96% cpu 1.107 total

yaruo@vip% time jruby bm_nbody.rb 10000
2.72s user 0.38s system 117% cpu 2.645 total

         ____
       /      \
      /  ─    ─\
    /    (○)  (○) \
    |       (__人__)    | ________
     \      ` ⌒´   ,/ .| |          |
    ノ           \ | |          |
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  |

       ____
     /⌒三 ⌒\
   /( ○)三(○)\
  /::::::⌒(__人__)⌒::::: \   JRubyの方が倍以上遅いお......
  |     |r┬-|     |
  \      `ー'´     /

       ____
     /      \
   /  _ノ  ヽ、_  \
  /  o゚⌒   ⌒゚o  \  JRubyでエンタープライズなんて嘘だったんだお......
  |     (__人__)    |
  \     ` ⌒´     /


   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)      JRubyは最適化オプションを効かさないと
  |     ` ⌒´ノ      早くならないだろ、常識的に考えて......
.  |         }
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \


         |
     \  __  /
     _ (m) _
        |ミ|
      /  `´  \
       ____
     /⌒  ⌒\
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \ JRubyに最適化オプションをつければいいんだお!!!
  |     |r┬-|     |
  \      `ー'´     /

       ____
     /⌒  ⌒\
   /( ●)  (●)\    サーバVMをつかって実行時最適化を効かせるお!
  /::::::⌒(__人__)⌒::::: \   JRubyは、-Jオプションでjavaにオプションを渡せるお!
  |     |r┬-|     |
  \      `ー'´     /


yaruo@vip% time jruby -J-server bm_nbody.rb 10000
2.57s user 0.37s system 116% cpu 2.520 total

       ____
     /      \
   / ─    ─ \
  /   (●)  (●)   \   あまり変わらないお......
  |      (__人__)    |
  \     ` ⌒´     /

      ____
    /_ノ   ヽ_\
   /( ●) ( ●)\      jruby.compile.fastestオプションは
 / ::::::⌒(__人__)⌒:::::\   JITコンパイルでRubyには必要だけど
 |        ̄      |   Javaバイトコードに不要な処理をスキップするお......
 \              /

yaruo@vip% time jruby -J-server -J-Djruby.compile.fastest=true bm_nbody.rb 10000
2.72s user 0.38s system 124% cpu 2.498 total

       ____
     /   ノ( \
   /  _ノ  ヽ、_ \ こうなったら、バイトコードへの
  / ノ( ●━━●   \  実行時コンパイルを強制してみるしかないお......
  |  ⌒ (__人__) ノ(  |
  \     ` ⌒´   ⌒/


% time jruby -J-server -J-Djruby.compile.fastest=true -J-Djruby.compile.mode=FORCE bm_nbody.rb 10000

       ______
      /  \    /\
    /  し (>)  (<)\
    | ∪    (__人__)  J | ________
    \  u   `⌒´   / | |          |
    ノ           \ | |          |


         ____
      /  \    ─\   チラッ
    /  し (>)  (●)\
    | ∪    (__人__)  J | ________
    \  u   `⌒´   / | |          |
    ノ           \ | |          |

% time jruby -J-server -J-Djruby.compile.fastest=true -J-Djruby.compile.mode=FORCE bm_nbody.rb 10000
2.90s user 0.40s system 122% cpu 2.689 total

         ____
      /::::::─三三─\
    /:::::::: ( ○)三(○)\  おそくなってやがる!!
    |::::::::::::::::::::(__人__)::::  | ________
     \:::::::::   |r┬-|  / | |          |
    ノ::::::::::::  `ー'´   \ | |          |


        ノ L____
       ⌒ \ / \
      / (○) (○)\
     /    (__人__)   \  バイトコードコンパイルなんて役に立たないお!!
     |       |::::::|     |
     \       l;;;;;;l    /l!| !
     /     `ー'    \ |i
   /          ヽ !l ヽi
   (   丶- 、       しE |そ  ドンッ!!
    `ー、_ノ       ∑ l、E ノ <
               レY^V^ヽl
 

  / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)      コンパイル時間を考えないと駄目だろ
  |     ` ⌒´ノ      常識的に考えて......
.  |         }
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \


       ____
     /ノ   ヽ、_\
   /( ○)}liil{(○)\
  /    (__人__)   \ もうJRubyなんて捨てちまうお!!!
  |   ヽ |!!il|!|!l| /   |
  \    |ェェェェ|     /


      / ̄ ̄\   
    /ノ( _ノ  \
    | ⌒(( ●)(●)    
    .|     (__人__) /⌒l
     |     ` ⌒´ノ |`'''|
    / ⌒ヽ     }  |  |              
   /  へ  \   }__/ /             / ̄ ̄\
 / / |      ノ   ノ           / ●)) ((●\', ・
( _ ノ    |      \´       _    (   (_人_)'∴ ),  '
       |       \_,, -‐ ''"   ̄ ゙̄''-----└'´ ̄`ヽ   て
       .|                  ______ ノ    (
       ヽ           _,, -‐ ''"  ノ       ヽ   r'" ̄
         \       , '´        し/.. >>@ | J
          \     (           /      |
            \    \         し-  '^`-J


  / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)      試行回数を増やしてJVMの最適化が効いてくると
  |     ` ⌒´ノ      JRubyの方が速いだろ、常識的に考えて......
.  |         }
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

yaranaio@vip% time ruby bm_nbody.rb 50000
5.19s user 0.08s system 96% cpu 5.457 total

yaranaio@vip% time jruby -J-server bm_nbody.rb 50000
4.07s user 0.40s system 115% cpu 3.877 total


       ____
     /⌒  ⌒\
   /( >)  (<)\
  /::::::⌒(__人__)⌒::::: \  シシシシシシシシッ
  |    /| | | | |     |
  \  (、`ー―'´,    /
       ̄ ̄ ̄  

       ____
     /⌒  ⌒\
   /( ―)  (―)\ JRubyはスレッド性能もいいから 
  /::::::⌒(__人__)⌒::::: \ マルチコア時代に最適だお!!
  |              |
  \               /


       ____
     /⌒  ⌒\
   /( ●)  (●)\      JRubyはネイティブスレッドの並列実行対応なのに
  /::::::⌒(__人__)⌒::::: \   Ruby 1.8は、いまどきグリーンスレッドだお!
  |     |r┬-|     |
  \      `ー'´     /


       . ... .
       :____:
     :/_ノ  ー、\:
   :/( ●) (●)。\:
  :/:::::: r(__人__) 、::::\:  ウッ・・・p...
  :|    { l/⌒ヽ    |:
  :\   /   /   /:


       ____
     /-‐  ‐-\
   / ( ⌒) (● )\
  /::::::⌒(__人__)⌒:::::\
  |     l/⌒ヽ    |  おっと、失礼したお
  \   /   /   /

       ____
     /⌒  ⌒\
   /( ●)  (●)\    さっそくバイトニックマージソートを
  /::::::⌒(__人__)⌒::::: \  並列実行でやってみるお!
  |     |r┬-|     |
  \      `ー'´     /

yaruo@vip% time ruby bitonic_sorting.rb
0.14s user 0.12s system 70% cpu 0.368 total

yaruo@vip% time jruby bitonic_sorting.rb
1.69s user 0.44s system 28% cpu 7.527 total

       ____
     /ノ   ヽ、_\
   /( ○)}liil{(○)\
  /    (__人__)   \ 20倍くらい遅いお!!!
  |   ヽ |!!il|!|!l| /   |
  \    |ェェェェ|     /


   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)  そういうときにはjruby.thread.pool.enabledオプションで
  |     ` ⌒´ノ   スレッドプールをつかうだろ、常識的に考えて......
.  |         }
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

       ____
     /      \
   /  _ノ  ヽ、_  \
  / o゚((●)) ((●))゚o \ うっうっ......試してみるお......
  |     (__人__)    |
  \     ` ⌒´     /


% time jruby -J-Djruby.thread.pool.enabled=true bitonic_sorting.rb
1.80s user 0.45s system 38% cpu 5.828 total

       ____
     /      \
   /  _ノ  ヽ、_  \
  /  o゚⌒   ⌒゚o  \  やっぱり、あんまり早くならないお......
  |     (__人__)    |
  \     ` ⌒´     /

      ._
       \ヽ, ,、
        `''|/ノ
         .|
     _   |
     \`ヽ、|
      \, V
         `L,,_
         |ヽ、)  ,、
        /    ヽYノ
       /    r''ヽ、.|
      |     `ー-ヽ|ヮ
      |       `|
      |.        |
      ヽ、      |
        ヽ____ノ      
        /_ノ ' ヽ_\
      /(≡)   (≡)\
     /::::::⌒(__人__)⌒::::: \      
     |     |r┬-|     |      
     \      `ー'´     /
     /          \
     (  |          |  )
     \|    э    |/
       (    ,,,,    ,ノ
       \  、(U)ノ ノ
         \/  /            ┼ヽ  -|r‐、. レ |
         /  /\            d⌒) ./| _ノ  __ノ 
      ⊂⌒__)__)

コメントする

著者について

高井直人
高井 直人
takai@recompile.net

ソフトウェアエンジニア。1977年横浜生まれ。大学在学中からネットワークや情報技術にたずさわる。Web制作会社などを経て、現在はシステムインテグレータに勤務。エンタープライズRubyをテーマに社内標準の策定などに従事している。

タグクラウド

ウェブページ

Powered by Movable Type 4.1-en-release-26-r1141-20080104