斎藤です。

On Thu, 4 Sep 2008 19:47:43 +0900
"Yusuke ENDOH" <mame / tsg.ne.jp> wrote:

> private.h がなかったのですが、struct RString と RSTRING
> マクロの定義だけ書いたものでコンパイルしてみました。

ごめんなさい、付け忘れました。おっしゃるとおりのものです。

private.h:

#define RSTRING(obj) (R_CAST(RString)(obj))

struct RString {
    struct RBasic basic;
    union {
	struct {
	    long len;
	    char *ptr;
	    union {
		long capa;
		VALUE shared;
	    } aux;
	} heap;
	char ary[RSTRING_EMBED_LEN_MAX + 1];
    } as;
};

> やはり、関数にするとオーバーヘッドが発生するようです。

あれ、最適化オプション付けてますか? 手元で-O2を付けると、以下のようになりました。
数値は、5回測って一番速かったものです。

# パッチ前

$ time ./ruby-trunk -rstringio -e '
s = StringIO.new(" " * 100)
i = 0
while i < 100000000
  s.eof
  i += 1
end'

real	0m15.810s
user	0m15.801s
sys	0m0.020s


# パッチ後

$ time ./ruby-trunk -rstringio -e '
s = StringIO.new(" " * 100)
i = 0
while i < 100000000
  s.eof
  i += 1
end'

real	0m15.781s
user	0m15.777s
sys	0m0.008s

ということで、インライン関数版の方がなぜか速くなってしまいました。
自分には理由はよく分かりませんが、とにかく影響が(少なくとも自分の環境では)誤差範囲内に
とどまる、とだけは言えそうです。

> > 拡張ライブラリを一度でも作ったことのある人間ならば、README.EXTが網羅的なもので
> > ないことは、火を見るより明らかでしょう。
> 
> README.EXT を整理・増強していくのが正しい方向性だと思います。

自分はREADME.EXTはチュートリアルに準ずるもので、すべてのAPIを解説するという趣旨が
元からないのだと思ってました。

でちょっと別の話ですが、現状の話ですと

「README.EXTに記載されているものが公開APIである」
→「今は完全ではない」 (外部シンボルになっていても記載されていないものがたくさん)
→「今は公開APIがどれだかよく分からない」
→「仕様をfreezeする対象(API)がよく分かってないので、今はfreezeしようがない」
→ 「↓

On Tue, 2 Sep 2008 15:23:30 +0900
"Yugui (Yuki Sonoda)" <yugui / yugui.jp> wrote:

>  * CレベルのAPIはruby-core/ruby-devでの事前相談なしに変更不可
>    * include/ruby/*.hにあるすべての構造体、データ型、変数、関数、マクロ
> はCレベルAPIと見なします。
>    * 公開したくないものはinclude/ruby/*.hから移動させてください。

 という宣言はそもそも意味を成さない」

となる、ということでよろしいのでしょうか。

> そのためにも README.EXT に書いてあることだけでできないことに
> 気がついた人は、そのたびに ML で API の公開を要求をするのが
> いいと思います。

これはまたそのうち、自分が経験したものを別メールで出してみます。

> > 「インストールされたヘッダファイル=公開されたAPI」というごく当たり前の事が、
> 
> それって当たり前なんでしょうか。

まつもとさんも違うとおっしゃってるあたり、ここは自分の見識が狭かっただけなんだと
思います。すみません。

> 個人的には「undocumented な機能を使ったらどうなっても文句が
> 言えない」という方が当たり前だと思っています。

自分もそれが当たり前であって欲しいと思います。しかし現状のRubyにすぐそれを要求するのは
難しいとも思います。

というか、リリースマネージャであるyuguiさんが、どのような意図を持って

>    * include/ruby/*.hにあるすべての構造体、データ型、変数、関数、マクロ
> はCレベルAPIと見なします。

とおっしゃったかが気になります。自分は、データ構造を隠蔽すべきだ、という主張に読めた
のですが(それとも、オブジェクト埋め込みの仕様とかまでAPIと宣言したかった?)。

--
斎藤ただし