From: "watashinoid1 (moe info)" Date: 2012-04-14T01:24:55+09:00 Subject: [ruby-dev:45512] [ruby-trunk - Feature #6289][Open] メソッドのインライン化について Issue #6289 has been reported by watashinoid1 (moe info). ---------------------------------------- Feature #6289: メソッドのインライン化について https://bugs.ruby-lang.org/issues/6289 Author: watashinoid1 (moe info) Status: Open Priority: Normal Assignee: Category: Target version: Rubyはメソッド呼び出しが重いです。 一方でC++などはmov数個とcall一個で終わりますね? そこでインライン化を考えてみようと思ったのですが、C++と違って動的なクラス定義が許されている言語なので安易にインライン化はできません。 ---------------------------- 安全にインライン化するためには インライン化できるメソッドの条件 ・インライン化されるメソッドはクラス定義、メソッド定義を呼ばない ・インライン化できるメソッドしか呼ばない 四則演算や配列操作は明らかにクラス定義、メソッド定義を呼ばないので、インライン化できます。 するとそれらのみを使うメソッドはインライン化できます。 こうしてボトムアップでインライン化できるかどうかを全てのメソッドに対して決めることができます。 ここでついでにそのメソッドから呼ばれる可能性のあるメソッドを列挙してリストにしておきます。 ------------------------------------------ 次の問題はインライン化されたあとにその内部で呼ばれるメソッド定義が書き換わった場合に、インライン化をやり直さないといけないのですが これは先ほど作ったメソッドのリストを見て、定義が書き換わったかどうかを判定できます。 分かりやすく言えば、"メソッドの飛び先のチェックがループの外に出たら速い"ってことです ------------------------------ 四則演算とか、オーバーライドされる可能性のせいで遅くなるのはもったいなあと。99.9999%のケースでオーバーライドされないんだから・・・ 99.9999%側なのか0.00001%側なのかのチェックをループの外に出すのって最適化の基本かなと bignumへの移行を考えると、add jcc sub jcc みたいにコンディショナルジャンプを一個ごとに挟まないといけなそうですが 分岐予測テーブルを汚染しそう 実際の実装はLLVMでやってみようかな ------------------------------------------------- 最近Ruby開発に興味が出たひよっこですが。こんなことやってみようかなと、とりあえずつぶやいてみます もしかしてRuby1.9で既にやられてるのかな?ISEQとか怪しい -- http://bugs.ruby-lang.org/