1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

st optimize st_insert

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34314 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shyouhei 2012-01-15 15:46:44 +00:00
parent 9ed8c1f15e
commit d3f8488b1c
2 changed files with 19 additions and 10 deletions

View file

@ -1,3 +1,11 @@
Mon Jan 16 00:41:33 2012 Sokolov Yura <funny.falcon@gmail.com>
* st.c: st use function instead of macro. In my current
environment (Ubunu 11.04 32bit gcc-4.5.2) it gives 4%
performance improvement.
https://github.com/ruby/ruby/pull/77
Sun Jan 15 14:09:48 2012 NARUSE, Yui <naruse@ruby-lang.org>
* object.c (rb_inspect): raise the result is not compatible with

21
st.c
View file

@ -420,11 +420,11 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
#undef collision_check
#define collision_check 1
static void
static inline void
add_direct(st_table * table, st_data_t key, st_data_t value,
st_index_t hash_val, st_index_t bin_pos)
st_index_t hash_val, register st_index_t bin_pos)
{
st_table_entry *entry;
register st_table_entry *entry;
if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
rehash(table);
bin_pos = hash_val % table->num_bins;
@ -432,10 +432,11 @@ add_direct(st_table * table, st_data_t key, st_data_t value,
entry = st_alloc_entry();
entry->next = table->bins[bin_pos];
table->bins[bin_pos] = entry;
entry->hash = hash_val;
entry->key = key;
entry->record = value;
entry->next = table->bins[bin_pos];
if (table->head != 0) {
entry->fore = 0;
(entry->back = table->tail)->fore = entry;
@ -445,7 +446,6 @@ add_direct(st_table * table, st_data_t key, st_data_t value,
table->head = table->tail = entry;
entry->fore = entry->back = 0;
}
table->bins[bin_pos] = entry;
table->num_entries++;
}
@ -487,7 +487,8 @@ add_packed_direct(st_table *table, st_data_t key, st_data_t value)
int
st_insert(register st_table *table, register st_data_t key, st_data_t value)
{
st_index_t hash_val, bin_pos;
st_index_t hash_val;
register st_index_t bin_pos;
register st_table_entry *ptr;
if (table->entries_packed) {
@ -518,7 +519,8 @@ int
st_insert2(register st_table *table, register st_data_t key, st_data_t value,
st_data_t (*func)(st_data_t))
{
st_index_t hash_val, bin_pos;
st_index_t hash_val;
register st_index_t bin_pos;
register st_table_entry *ptr;
if (table->entries_packed) {
@ -549,7 +551,7 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
void
st_add_direct(st_table *table, st_data_t key, st_data_t value)
{
st_index_t hash_val, bin_pos;
st_index_t hash_val;
if (table->entries_packed) {
add_packed_direct(table, key, value);
@ -557,8 +559,7 @@ st_add_direct(st_table *table, st_data_t key, st_data_t value)
}
hash_val = do_hash(key, table);
bin_pos = hash_val % table->num_bins;
add_direct(table, key, value, hash_val, bin_pos);
add_direct(table, key, value, hash_val, hash_val % table->num_bins);
}
static void