aboutsummaryrefslogtreecommitdiffstats
path: root/st.c
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-01-15 15:46:44 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-01-15 15:46:44 +0000
commitd3f8488b1cdcd210515e1a81afdc8e3e4a7920b3 (patch)
treef7c3367a49f50c2b403abe635bedb0ef125b19d2 /st.c
parent9ed8c1f15e3f755a6421a37ba114562071a98404 (diff)
downloadruby-d3f8488b1cdcd210515e1a81afdc8e3e4a7920b3.tar.gz
st optimize st_insert
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34314 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'st.c')
-rw-r--r--st.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/st.c b/st.c
index aa0da569ab..48fe565993 100644
--- a/st.c
+++ b/st.c
@@ -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