Project

General

Profile

Actions

Feature #6289

closed

メソッドのインライン化について

Added by watashinoid1 (moe info) about 12 years ago. Updated about 12 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-dev:45512]

Description

Rubyはメソッド呼び出しが重いです。
一方でC++などはmov数個とcall一個で終わりますね?

そこでインライン化を考えてみようと思ったのですが、C++と違って動的なクラス定義が許されている言語なので安易にインライン化はできません。


安全にインライン化するためには

インライン化できるメソッドの条件
・インライン化されるメソッドはクラス定義、メソッド定義を呼ばない
・インライン化できるメソッドしか呼ばない

四則演算や配列操作は明らかにクラス定義、メソッド定義を呼ばないので、インライン化できます。
するとそれらのみを使うメソッドはインライン化できます。
こうしてボトムアップでインライン化できるかどうかを全てのメソッドに対して決めることができます。

ここでついでにそのメソッドから呼ばれる可能性のあるメソッドを列挙してリストにしておきます。


次の問題はインライン化されたあとにその内部で呼ばれるメソッド定義が書き換わった場合に、インライン化をやり直さないといけないのですが
これは先ほど作ったメソッドのリストを見て、定義が書き換わったかどうかを判定できます。

分かりやすく言えば、"メソッドの飛び先のチェックがループの外に出たら速い"ってことです

四則演算とか、オーバーライドされる可能性のせいで遅くなるのはもったいなあと。99.9999%のケースでオーバーライドされないんだから・・・
99.9999%側なのか0.00001%側なのかのチェックをループの外に出すのって最適化の基本かなと

bignumへの移行を考えると、add jcc sub jcc みたいにコンディショナルジャンプを一個ごとに挟まないといけなそうですが
分岐予測テーブルを汚染しそう

実際の実装はLLVMでやってみようかな

最近Ruby開発に興味が出たひよっこですが。こんなことやってみようかなと、とりあえずつぶやいてみます
もしかしてRuby1.9で既にやられてるのかな?ISEQとか怪しい

Actions

Also available in: Atom PDF

Like0
Like0