Author: Nicolas Truessel <ntrues...@njsm.de> Branch: quad-color-gc Changeset: r87033:332c546faefd Date: 2016-09-12 12:25 +0200 http://bitbucket.org/pypy/pypy/changeset/332c546faefd/
Log: Update qcgc codebase (performance optimizations) diff --git a/rpython/translator/c/src/qcgc/allocator.c b/rpython/translator/c/src/qcgc/allocator.c --- a/rpython/translator/c/src/qcgc/allocator.c +++ b/rpython/translator/c/src/qcgc/allocator.c @@ -276,24 +276,16 @@ for ( ; index < QCGC_SMALL_FREE_LISTS; index++) { size_t list_cell_size = small_index_to_cells(index); - while (qcgc_allocator_state.fit_state.small_free_list[index]->count - > 0) { + if (qcgc_allocator_state.fit_state.small_free_list[index]->count > 0) { result = qcgc_allocator_state.fit_state.small_free_list[index]-> - items[qcgc_allocator_state.fit_state.small_free_list[index] - ->count - 1]; + items[0]; qcgc_allocator_state.fit_state.small_free_list[index] = qcgc_linear_free_list_remove_index( qcgc_allocator_state.fit_state.small_free_list[index], - qcgc_allocator_state.fit_state.small_free_list[index]-> - count - 1); - - // Check whether block is still valid - if (valid_block(result, list_cell_size)) { - // The next call might invalidate free_list, reload! - qcgc_arena_mark_allocated(result, cells); - qcgc_fit_allocator_add(result + cells, list_cell_size - cells); - return result; - } + 0); + qcgc_arena_mark_allocated(result, cells); + qcgc_fit_allocator_add(result + cells, list_cell_size - cells); + return result; } } return fit_allocator_large_first_fit(0, cells); @@ -309,30 +301,18 @@ cell_t *result = NULL; size_t best_fit_cells = SIZE_MAX; - size_t i = 0; - while (i < qcgc_allocator_state.fit_state.large_free_list[index]->count) { - if (valid_block(qcgc_allocator_state.fit_state.large_free_list[index] -> - items[i].ptr, - qcgc_allocator_state.fit_state.large_free_list[index]-> - items[i].size)) { - if (qcgc_allocator_state.fit_state.large_free_list[index]-> - items[i].size >= cells && - qcgc_allocator_state.fit_state.large_free_list[index]-> - items[i].size < best_fit_cells) { - result = qcgc_allocator_state.fit_state.large_free_list[index]-> - items[i].ptr; - best_fit_cells = qcgc_allocator_state.fit_state. - large_free_list[index]->items[i].size; - best_fit_index = i; - } - i++; - } else { - qcgc_allocator_state.fit_state.large_free_list[index] = - qcgc_exp_free_list_remove_index(qcgc_allocator_state.fit_state. - large_free_list[index], i); - // NO i++ ! + size_t count = qcgc_allocator_state.fit_state.large_free_list[index]->count; + for (size_t i = 0; i < count; i++) { + if (qcgc_allocator_state.fit_state.large_free_list[index]-> + items[i].size >= cells && + qcgc_allocator_state.fit_state.large_free_list[index]-> + items[i].size < best_fit_cells) { + result = qcgc_allocator_state.fit_state.large_free_list[index]-> + items[i].ptr; + best_fit_cells = qcgc_allocator_state.fit_state. + large_free_list[index]->items[i].size; + best_fit_index = i; } - if (best_fit_cells == cells) { break; } @@ -359,24 +339,17 @@ assert(1u<<(index + QCGC_LARGE_FREE_LIST_FIRST_EXP) >= cells); #endif for ( ; index < QCGC_LARGE_FREE_LISTS; index++) { - while(qcgc_allocator_state.fit_state.large_free_list[index]->count - > 0) { + if (qcgc_allocator_state.fit_state.large_free_list[index]->count > 0) { struct exp_free_list_item_s item = - qcgc_allocator_state.fit_state.large_free_list[index]->items[ - qcgc_allocator_state.fit_state.large_free_list[index]->count - 1 - ]; + qcgc_allocator_state.fit_state.large_free_list[index]->items[0]; qcgc_allocator_state.fit_state.large_free_list[index] = qcgc_exp_free_list_remove_index( qcgc_allocator_state.fit_state.large_free_list[index], - qcgc_allocator_state.fit_state.large_free_list[index]-> - count - 1); + 0); - // Check whether block is still valid - if (valid_block(item.ptr, item.size)) { - qcgc_arena_mark_allocated(item.ptr, cells); - qcgc_fit_allocator_add(item.ptr + cells, item.size - cells); - return item.ptr; - } + qcgc_arena_mark_allocated(item.ptr, cells); + qcgc_fit_allocator_add(item.ptr + cells, item.size - cells); + return item.ptr; } } return NULL; diff --git a/rpython/translator/c/src/qcgc/qcgc.c b/rpython/translator/c/src/qcgc/qcgc.c --- a/rpython/translator/c/src/qcgc/qcgc.c +++ b/rpython/translator/c/src/qcgc/qcgc.c @@ -69,11 +69,6 @@ * Shadow stack */ void qcgc_shadowstack_push(object_t *object) { - if (qcgc_state.phase != GC_PAUSE) { - qcgc_state.phase = GC_MARK; - qcgc_push_object(object); - } - *qcgc_state.shadow_stack = object; qcgc_state.shadow_stack++; } @@ -153,8 +148,7 @@ if (size <= 1<<QCGC_LARGE_ALLOC_THRESHOLD_EXP) { // Use bump / fit allocator - //if (qcgc_allocator_state.use_bump_allocator) { - if (false) { + if (qcgc_allocator_state.use_bump_allocator) { result = qcgc_bump_allocate(size); } else { result = qcgc_fit_allocate(size); @@ -209,10 +203,6 @@ } void qcgc_mark(bool incremental) { - if (qcgc_state.phase == GC_COLLECT) { - return; // Fast exit when there is nothing to mark - } - { struct log_info_s { bool incremental; @@ -226,16 +216,6 @@ qcgc_state.bytes_since_incmark = 0; if (qcgc_state.phase == GC_PAUSE) { - qcgc_state.phase = GC_MARK; - - // If we do this for the first time, push all roots. - // All further changes to the roots (new additions) will be added - // by qcgc_shadowstack_push - for (object_t **it = qcgc_state.shadow_stack_base; - it < qcgc_state.shadow_stack; - it++) { - qcgc_push_object(*it); - } // If we do this for the first time, push all prebuilt objects. // All further changes to prebuilt objects will go to the gp_gray_stack @@ -248,6 +228,15 @@ } } + qcgc_state.phase = GC_MARK; + + // Always push all roots to make shadowstack pushes faster + for (object_t **it = qcgc_state.shadow_stack_base; + it < qcgc_state.shadow_stack; + it++) { + qcgc_push_object(*it); + } + while (qcgc_state.gray_stack_size > 0) { // General purpose gray stack (prebuilt objects and huge blocks) size_t to_process = (incremental ? _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit