From: whiteleaf <2nd.leaf@...> Date: 2010-07-03T16:09:01+09:00 Subject: [ruby-dev:41795] rb_to_float が遅い whiteleaf と申します。 バグと言ってよいのかわからなかったのでチケットにはしませんでした。 object.c の rb_to_float で T_FLOAT 以外のデータが渡された時が遅いです。 例えばこんな時に影響が出てきます。 require "benchmark" Benchmark.bm { |bm| vertecies = Array.new(3 * 600000).fill(0) bm.report { vertecies.pack("f*") } } ruby 1.9.3dev (2010-07-03 trunk 28532) [i386-cygwin] user system total real 1.437000 0.000000 1.437000 ( 1.433000) 上の例は、OpenGL で大量の頂点データを glBufferSubData という関数が使えるためのデータに 変換しているシーンを想定しています。ポリゴンの頂点データは大量にあることが普通なので、無駄に多くしてある わけではありません。 もちろん最初から float に変換しておけば問題ないわけですが、一回ひっかかったので……。 rb_convert_type ではなく rb_Float を使えば速くなりました。 (rb_Float に変更後) user system total real 0.813000 0.031000 0.844000 ( 0.849000) Index: object.c =================================================================== --- object.c (リビジョン 28532) +++ object.c (作業コピー) @@ -2293,7 +2293,7 @@ val == Qfalse ? "false" : rb_obj_classname(val)); } - return rb_convert_type(val, T_FLOAT, "Float", "to_f"); + return rb_Float(val); } VALUE