[#41778] [Bug #3515] FreeBSD wrongly raises ECONNRESET on close(2) — Yui NARUSE <redmine@...>

Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)

12 messages 2010/07/02

[ruby-dev:41795] rb_to_float が遅い

From: whiteleaf <2nd.leaf@...>
Date: 2010-07-03 07:09:01 UTC
List: ruby-dev #41795
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

In This Thread

Prev Next