立石です.

st_foreach()にmark_entry()のようにST_CONTINUEだけが返る関数を与えてい
る部分が複数箇所あります.
そこで,このような関数のためにswitch文を省いたst_foreach_cont()とい
うマクロを作り,st_foreach()の代わりに用いるとちょっとだけ速度が上が
りました.st_foreach_cont()の追加に見合うだけの効果が得られるのかどう
かは分かりませんが報告しておきます.
パッチは以下のURLに置いておきます.

  http://kt-www.jaist.ac.jp/~ttate/ftp/ruby/ruby-1.7.x.st.c.2.diff.gz

以下は,samples/test.rbを実行した場合の結果です.大体2-4%ほど時間が短
くなります.(gcc-3.0.4で試しています.)

変更前:
real    0m2.567s
user    0m2.370s
sys     0m0.080s

st_foreach_cont()を利用
real    0m2.488s
user    0m2.270s
sys     0m0.110s

また,st_foreach()自体をマクロにすることも試していたのですが,

1) st_foreach_cont()がある場合には速度があまり変わらず遅くなる場合もあ
ります.これは return でforループを抜ける部分を条件文に書き換えたことが
影響するためだと思います.

2) st_foreach_cont()を使わない場合には,st_foreach_cont()を単独で使う場
合とほとんど変わりません.gccの最適化でうまく処理されているのかもしれま
せんが,よく分かりません.

結局,st_foreach()だけをマクロにする場合と,st_foreach_cont()だけを追加
する場合ではあまり変わらず,組み合わせても相乗効果はなさそうです.
-- 
Takaaki Tateishi <ttate / kt.jaist.ac.jp>