Cより速いRubyプログラム (桑田 誠)
- スピーカー
- 桑田 誠
- プロフィール
- プログラマー
- 講演時間
- 14:40〜15:10
- 講演者による資料
- http://www.kuwata-lab.com/presen/rubykaigi2007.pdf
http://www.kuwata-lab.com/presen/erubybench-1.1.zip
2007年のスクリプト言語
『PS3症候群』からの脱却
- PS3/PSP…高性能こそ正義!
- 速い、高い、難しい
- Wii/DS…ユーザがほしいものは何か?
- 必要な速さ・・・
主役になれないスクリプト言語
- 業界の主役はまだしばらくはJava
- Javaが高速だとか静的型チェックがどうだとかよりJavaがお金になるからという理由で
- ちょうどいいくらいに複雑。単価が高くておいしい言語
- スクリプト言語で喜ぶのは顧客と一部の開発者。既得権益を持つ人(SIerとか)はJavaがいい。主役はJavaのまま
- スクリプト言語が主役になるときは産業構造が変わるとき
- 産業構造を変えるベンチャー企業
- 内製に切り替わるユーザー企業
スクリプト言語の問題点と真実
巷でよく言われる問題点への反論
- 人員数
- スクリプト言語は人員が集めにくい→質より量
- 可用性
- Javaのが上。(Sunなどが金をつぎ込んでいるから当然なんだけど)→でも実装より運用
- 速度
- Javaが速いのは事実。でも…→言語より知識(アルゴリズムやプログラムの工夫)
発表について
- ポイント
- 言語の速さ ≠ アプリの速さ
- 内容
- Cより速いRubyプログラムを紹介
- 題材
- eRuby
- 注意
- よいCプログラムより速いわけではない
eRubyについて
テキスト中に任意のRubyコードを埋め込むための仕様
eRuby処理系
eruby…C実装 ERB…ERB
サンプル
でダウンロードしてください。
- C実装eRubyの場合
- 一行ずつprintしている
- ERBの場合
- 文字列を結合してからprintしている
- 変換と実装の2つのフェーズで実行される
- ERBのボトルネックは変換部
- 実行部はほぼ一緒
速い実装
行へ分解しない
- 入力を分解しない
- 複数行をまとめて出力
構文解析をしない
- パターンマッチで済ませる
- あっさり、C実装のeRubyを抜いてしまった
- XMLパーサーなんて正規表現で済ませられる場合もあるよ
パターンマッチをチューニング
- グルーピングを使わずに自力で分解
インライン展開
- Rubyのメソッド呼び出しはそれなりのコスト
実行部分のチューニング
配列バッファ
- 文字列バッファを使わずに配列バッファを使う
- 実行部分で10%の改善
- Array#pushには複数個の引数を与えることが出来るのでメソッド呼び出しを減らすことが出来る。
式展開
- 文字バッファを使った場合、式展開でメソッド呼び出しを減らすことができる。
- %Q`で"をエスケープする手間を省く
- 配列バッファと同じくらいの効果
ファイルキャッシュ
- 変換部分のコストが0になった
メソッド化
- evalを使うとコスト高
- メソッド化
- evalはパースに3分の1くらい
余計な処理をしない
- メソッド呼び出しを減らす
まとめ
- Cより1.5倍速いrubyプログラムを作成
- キャッシュ化で2倍、メソッド化で3倍
- 言語の速度より知識や工夫が重要
- 力が強いからって喧嘩につよいわけではない
- PS3の失敗は他人事ではありません。
このような機会をいただいた関係者に感謝しています。ありがとうございました。
Keyword(s):
References:[RubyKaigi2007速報ログ]