Ruby 1.9.0 のリリースおめでとうございます!

無事に1.9.0がリリースされたようで大変に目出たいことです。時々 svn up しながら眺めていましたが、ここ数日はとにかくもの凄い勢いで色々なものがcommitされていてびっくりしました(謎のgorubyとか)。皆様お疲れ様でした。

ところで先程 ruby-core に M. Edward (Ed) Borasky さんが投稿して下さったベンチマーク結果が流れておりました。

この結果は大変に興味深いのですが、メールそのままのだととっても見辛いので、簡単に整形して比率を加えたものを以下に表にしておきます。Ruby1.9.0に興味津々な皆様是非ともご覧下さいませ。なおベンチマークの条件や内容などはここには書きませんのでメール本文の方をご確認下さい。

項目名 ruby 1.8.6 (2007-12-03) ruby 1.9.0 (2007-12-25 revision 14709) 比率(1.8.6/1.9.0)
app_answer 1.53625392913818 0.13400411605835 11.46
app_erb 2.23458099365234 1.57998299598694 1.41
app_factorial 0.694716215133667 0.444912910461426 1.56
app_fib 11.3680670261383 1.44150710105896 7.89
app_mandelbrot 3.61981320381165 0.93461799621582 3.87
app_pentomino 183.978760957718 39.9713780879974 4.6
app_raise 1.69808006286621 1.68952989578247 1.01
app_strconcat 1.57846403121948 0.996259927749634 1.58
app_tak 14.9776599407196 2.18618512153625 6.85
app_tarai 12.5582439899445 1.79245805740356 7.01
app_uri 4.96692991256714 1.98099994659424 2.51
io_file_create 0.550206899642944 0.566741943359375 0.97
io_file_read 0.72334885597229 0.519173860549927 1.39
io_file_write 0.356566905975342 0.262768983840942 1.36
loop_generator 56.5723481178284 1.11044692993164 50.95
loop_times 11.2022171020508 2.43959283828735 4.59
loop_whileloop 13.0046269893646 1.45603704452515 8.93
loop_whileloop2 2.50535702705383 0.320430040359497 7.82
so_ackermann 26.2885670661926 1.85544490814209 14.17
so_array 11.4453599452972 2.67545294761658 4.28
so_binary_trees 4.30503797531128 1.36704993247986 3.15
so_concatenate 3.91674900054932 0.882771968841553 4.44
so_count_words 0.490777969360352 3.55722904205322 0.14
so_exception 3.67201900482178 2.55055713653564 1.44
so_fannkuch 84.7616000175476 51.860946893692 1.63
so_fasta 19.389740228653 5.67655801773071 3.42
so_k_nucleotide 8.10035991668701 4.2192759513855 1.92
so_lists 1.59231996536255 0.659258842468262 2.42
so_mandelbrot 42.8019068241119 16.2084069252014 2.64
so_matrix 3.27859997749329 0.793742179870605 4.13
so_meteor_contest 52.2575500011444 20.0999820232391 2.6
so_nbody 28.3777990341187 11.6796798706055 2.43
so_nested_loop 11.4682841300964 2.29553294181824 5.0
so_nsieve 27.8629460334778 6.61286902427673 4.21
so_nsieve_bits 74.7709109783173 8.90028190612793 8.4
so_object 8.86674499511719 1.98283505439758 4.47
so_partial_sums 32.7498679161072 12.1965389251709 2.69
so_pidigits 2.41420793533325 2.80991005897522 0.86
so_random 2.96923208236694 0.729001045227051 4.07
so_reverse_complement 4.14339995384216 4.04299592971802 1.02
so_sieve 0.849525928497314 0.187962055206299 4.52
so_spectralnorm 41.4432969093323 12.4843308925629 3.32
vm1_block 47.5090911388397 5.34108591079712 8.9
vm1_const 23.1181719303131 2.43142795562744 9.51
vm1_ensure 37.892012834549 1.93873500823975 19.54
vm1_ivar 21.4678978919983 3.85475015640259 5.57
vm1_ivar_set 21.2300369739532 4.83743500709534 4.39
vm1_length 24.722156047821 3.72566795349121 6.64
vm1_neq 20.6118760108948 3.06124901771545 6.73
vm1_not 16.1265139579773 2.3499960899353 6.86
vm1_rescue 24.3832228183746 1.55430102348328 15.69
vm1_simplereturn 39.7903399467468 3.70241904258728 10.75
vm1_swap 25.7141978740692 2.88358116149902 8.92
vm2_array 7.03480696678162 2.76925206184387 2.54
vm2_case 5.43204402923584 0.715604066848755 7.59
vm2_eval 17.8432769775391 46.1212179660797 0.39
vm2_method 28.2497239112854 4.29976391792297 6.57
vm2_mutex 10.6425650119781 2.34252882003784 4.54
vm2_poly_method 33.5412700176239 4.6308810710907 7.24
vm2_poly_method_ov 5.7778160572052 0.930914878845215 6.21
vm2_proc 10.2587428092957 1.44363212585449 7.11
vm2_regexp 5.10241913795471 2.87602686882019 1.77
vm2_send 7.12156820297241 0.859764099121094 8.28
vm2_super 9.18226003646851 1.45039200782776 6.33
vm2_unif1 6.42444896697998 0.910121917724609 7.06
vm2_zsuper 9.9683849811554 1.4930579662323 6.68
vm3_thread_create_join 1.16788816452026 3.24958300590515 0.36
vm3_thread_mutex 163.582499027252 9.55388998985291 17.12

なお、ruby 1.8.6 よりも 1.9.0 の方が結果の悪いもの(比率が1以下)は

  • io_file_create (0.97)
  • so_count_words (0.14)
  • so_pidigits (0.86)
  • vm2_eval (0.39)
  • vm3_thread_create_join (0.36)

の五つです。io_file_create, so_pidigits はまぁ誤差のようなものとして、so_count_words はなぜこんなに悪いんでしょう? vm2_eval は、そんなに eval 繰り返すヤツが悪い、で片付くとして、vm3_thread_create_join はちょこっと遅いみたいですね。でも mutex の方が早くなっているから良いのかも。

一方すごく速くなっているもの(比率5以上)は以下の29項目です。

  • app_answer (11.46)
  • app_fib (7.89)
  • app_tak (6.85)
  • app_tarai (7.01)
  • loop_generator (50.95)
  • loop_whileloop (8.93)
  • loop_whileloop2 (7.82)
  • so_ackermann (14.17)
  • so_nsieve_bits (8.4)
  • vm1_block (8.9)
  • vm1_const (9.51)
  • vm1_ensure (19.54)
  • vm1_ivar (5.57)
  • vm1_length (6.64)
  • vm1_neq (6.73)
  • vm1_not (6.86)
  • vm1_rescue (15.69)
  • vm1_simplereturn (10.75)
  • vm1_swap (8.92)
  • vm2_case (7.59)
  • vm2_method (6.57)
  • vm2_poly_method (7.24)
  • vm2_poly_method_ov (6.21)
  • vm2_proc (7.11)
  • vm2_send (8.28)
  • vm2_super (6.33)
  • vm2_unif1 (7.06)
  • vm2_zsuper (6.68)
  • vm3_thread_mutex (17.12)

項目名だけからでも、一応どんな部分が良くなったのか、ちょっとは推測できそうな感じですね。ループ系が速いのは微妙に気持ち良い感じかも知れません。

とにかく噂通り全体的に速くなっているようです。素晴しいことだと思います。