From: nobu.nakada@... Date: 2002-12-02T13:31:49+09:00 Subject: [ruby-dev:18980] Re: st_foreach() なかだです。 At Sun, 1 Dec 2002 16:41:52 +0900, Takaaki Tateishi wrote: > また,st_foreach()自体をマクロにすることも試していたのですが, > > 1) st_foreach_cont()がある場合には速度があまり変わらず遅くなる場合もあ > ります.これは return でforループを抜ける部分を条件文に書き換えたことが > 影響するためだと思います. > > 2) st_foreach_cont()を使わない場合には,st_foreach_cont()を単独で使う場 > 合とほとんど変わりません.gccの最適化でうまく処理されているのかもしれま > せんが,よく分かりません. > > 結局,st_foreach()だけをマクロにする場合と,st_foreach_cont()だけを追加 > する場合ではあまり変わらず,組み合わせても相乗効果はなさそうです. こんなのを思い付きましたが、修正個所が多くなりそうなので実際に は試してません。 #define ST_FOREACH_BEGIN(table) do { \ st_tabel *st_tbl = (table); \ st_table_entry *st_ptr, *st_last; \ int st_idx; \ for (st_idx = 0; st_idx < st_tbl->num_bins; ++st_idx) { \ st_last = 0; \ for (st_ptr = st_tbl->bins[st_idx]; st_ptr; st_ptr = st_ptr->next) #define ST_FOREACH_END } \ } while (0) #define ST_DELETE_CURRENT_ITEM() do { \ st_table_entry *tmp = st_ptr; \ st_ptr = st_ptr->next; \ if (st_last == 0) { \ st_tbl->bins[st_idx] = st_ptr; \ } \ else { \ st_last = st_ptr; \ } \ st_tbl->num_entries--; \ free(tmp); \ } while (0) #define ST_FOREACH_KEY st_ptr->key #define ST_FOREACH_VALUE st_ptr->record /* 使用例 */ static VALUE rb_hash_index(hash, value) VALUE hash, value; { ST_FOREACH_BEGIN(RHASH(hash)->tbl) { if (rb_equal(ST_FOREACH_VALUE, value)) { return key; } } ST_FOREACH_END; return Qnil; } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦