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:
parent
9ed8c1f15e
commit
d3f8488b1c
@ -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>
|
Sun Jan 15 14:09:48 2012 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* object.c (rb_inspect): raise the result is not compatible with
|
* object.c (rb_inspect): raise the result is not compatible with
|
||||||
|
21
st.c
21
st.c
@ -420,11 +420,11 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
|
|||||||
#undef collision_check
|
#undef collision_check
|
||||||
#define collision_check 1
|
#define collision_check 1
|
||||||
|
|
||||||
static void
|
static inline void
|
||||||
add_direct(st_table * table, st_data_t key, st_data_t value,
|
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) {
|
if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
|
||||||
rehash(table);
|
rehash(table);
|
||||||
bin_pos = hash_val % table->num_bins;
|
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 = st_alloc_entry();
|
||||||
|
|
||||||
|
entry->next = table->bins[bin_pos];
|
||||||
|
table->bins[bin_pos] = entry;
|
||||||
entry->hash = hash_val;
|
entry->hash = hash_val;
|
||||||
entry->key = key;
|
entry->key = key;
|
||||||
entry->record = value;
|
entry->record = value;
|
||||||
entry->next = table->bins[bin_pos];
|
|
||||||
if (table->head != 0) {
|
if (table->head != 0) {
|
||||||
entry->fore = 0;
|
entry->fore = 0;
|
||||||
(entry->back = table->tail)->fore = entry;
|
(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;
|
table->head = table->tail = entry;
|
||||||
entry->fore = entry->back = 0;
|
entry->fore = entry->back = 0;
|
||||||
}
|
}
|
||||||
table->bins[bin_pos] = entry;
|
|
||||||
table->num_entries++;
|
table->num_entries++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -487,7 +487,8 @@ add_packed_direct(st_table *table, st_data_t key, st_data_t value)
|
|||||||
int
|
int
|
||||||
st_insert(register st_table *table, register st_data_t key, st_data_t value)
|
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;
|
register st_table_entry *ptr;
|
||||||
|
|
||||||
if (table->entries_packed) {
|
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_insert2(register st_table *table, register st_data_t key, st_data_t value,
|
||||||
st_data_t (*func)(st_data_t))
|
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;
|
register st_table_entry *ptr;
|
||||||
|
|
||||||
if (table->entries_packed) {
|
if (table->entries_packed) {
|
||||||
@ -549,7 +551,7 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
|
|||||||
void
|
void
|
||||||
st_add_direct(st_table *table, st_data_t key, st_data_t value)
|
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) {
|
if (table->entries_packed) {
|
||||||
add_packed_direct(table, key, value);
|
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);
|
hash_val = do_hash(key, table);
|
||||||
bin_pos = hash_val % table->num_bins;
|
add_direct(table, key, value, hash_val, hash_val % table->num_bins);
|
||||||
add_direct(table, key, value, hash_val, bin_pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user