-- / --
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

12 / 23
Mon

本屋で買った本が重くて腕が痛い Ziphil です。

Kotlin で書いたコードを JRuby に移植して、 これからの開発は Kotlin にしようかな JRuby にしようかなー、 な状態なんですが、 JRuby への移植は機械的に行っただけなので、 Ruby っぽくないというか、 美しくないというか、 そんなところが結構あるんですよね。 さっきコードを眺めてて気になったのがこの処理。

def actual_power
  power = 0
  for i in 1..@roll
    power += rand(@power) + 1
  end
  power += @addition
  return power
end

武器で攻撃したときにどの程度威力が出るかを計算する部分です。 計算の説明は前のエントリーにあるので省略するとして、 このコード、 何かスッキリしてませんねぇ。 というか、 for 文の変数 i、 一度も使ってませんし。

Ruby っぽい書き方かどうかは分かりませんが、 実はこんなスマートに書けます。

def actual_power
  return Array.new(@roll){rand(@power) + 1}.inject{|a, b| a + b} + @addition
end

・・・なんと 1 行。 ちなみに、 inject{|a, b| a + b} はもっと短く inject(:+) と書けます。 こっちは端的ですが、 いまいち何やってるのか分かりにくいので、 私はあんまり使いません。

いやー、 Ruby のスローガンが 「Enjoy Programming」 なだけあって、 Ruby でのコーディングは楽しいです。 工夫のしがいがあるというか、 可能性無限大な感じです。


12/23 コードがスマートになったのは良いんですが、 よくよく考えると Array インスタンスを作るわけだから、 余計に時間がかかる気がする・・・。 ということで、 10 万回の実行速度を計測してみました。 結果がこれ。

              user     system      total        real
before:   0.561000   0.000000   0.561000 (  0.555000)
after:    0.734000   0.000000   0.734000 (  0.726000)

上が最初のコードで、 下が変更後のスマートなコードです。 変更後の方が若干遅いですね。 といっても、 10 万回の実行結果ですし、 このメソッドを 10 万回も一度に実行することはないですから、 それほど気にする程のことでもないでしょうけど。 いや、 「塵も積もれば山となる」 でしょうか・・・?

スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。