Exploit the fast-path for allocation of array with initial element 0 by changing

new-sequence on arrays, the vector constructor, and resize-array, called when
growing vectors, to fill arrays with 0 instead of f. user code never observes the
initial value in these situations anyway. small speedup on bootstrap
db4
Slava Pestov 2008-12-06 18:37:28 -06:00
parent 080cc92239
commit 0290be6e93
7 changed files with 20 additions and 30 deletions

View File

@ -12,9 +12,9 @@ M: array resize resize-array ;
: >array ( seq -- array ) { } clone-like ; : >array ( seq -- array ) { } clone-like ;
M: object new-sequence drop f <array> ; M: object new-sequence drop 0 <array> ;
M: f new-sequence drop dup zero? [ drop f ] [ f <array> ] if ; M: f new-sequence drop dup zero? [ drop f ] [ 0 <array> ] if ;
M: array equal? M: array equal?
over array? [ sequence= ] [ 2drop f ] if ; over array? [ sequence= ] [ 2drop f ] if ;

View File

@ -90,7 +90,7 @@ M: assoc assoc-clone-like ( assoc exemplar -- newassoc )
] if ; inline recursive ] if ; inline recursive
: assoc-stack ( key seq -- value ) : assoc-stack ( key seq -- value )
dup length 1- swap (assoc-stack) ; dup length 1- swap (assoc-stack) ; flushable
: assoc-subset? ( assoc1 assoc2 -- ? ) : assoc-subset? ( assoc1 assoc2 -- ? )
[ swapd at* [ = ] [ 2drop f ] if ] curry assoc-all? ; [ swapd at* [ = ] [ 2drop f ] if ] curry assoc-all? ;

View File

@ -12,12 +12,12 @@ IN: namespaces
PRIVATE> PRIVATE>
: namespace ( -- namespace ) namestack* peek ; : namespace ( -- namespace ) namestack* peek ; inline
: namestack ( -- namestack ) namestack* clone ; : namestack ( -- namestack ) namestack* clone ;
: set-namestack ( namestack -- ) >vector 0 setenv ; : set-namestack ( namestack -- ) >vector 0 setenv ;
: global ( -- g ) 21 getenv { hashtable } declare ; inline : global ( -- g ) 21 getenv { hashtable } declare ; inline
: init-namespaces ( -- ) global 1array set-namestack ; : init-namespaces ( -- ) global 1array set-namestack ;
: get ( variable -- value ) namestack* assoc-stack ; flushable : get ( variable -- value ) namestack* assoc-stack ; inline
: set ( value variable -- ) namespace set-at ; : set ( value variable -- ) namespace set-at ;
: on ( variable -- ) t swap set ; inline : on ( variable -- ) t swap set ; inline
: off ( variable -- ) f swap set ; inline : off ( variable -- ) f swap set ; inline
@ -28,7 +28,7 @@ PRIVATE>
: inc ( variable -- ) 1 swap +@ ; inline : inc ( variable -- ) 1 swap +@ ; inline
: dec ( variable -- ) -1 swap +@ ; inline : dec ( variable -- ) -1 swap +@ ; inline
: bind ( ns quot -- ) swap >n call ndrop ; inline : bind ( ns quot -- ) swap >n call ndrop ; inline
: counter ( variable -- n ) global [ dup inc get ] bind ; : counter ( variable -- n ) global [ 0 or 1+ dup ] change-at ;
: make-assoc ( quot exemplar -- hash ) : make-assoc ( quot exemplar -- hash )
20 swap new-assoc [ >n call ndrop ] keep ; inline 20 swap new-assoc [ >n call ndrop ] keep ; inline

View File

@ -8,7 +8,7 @@ TUPLE: vector
{ underlying array } { underlying array }
{ length array-capacity } ; { length array-capacity } ;
: <vector> ( n -- vector ) f <array> 0 vector boa ; inline : <vector> ( n -- vector ) 0 <array> 0 vector boa ; inline
: >vector ( seq -- vector ) V{ } clone-like ; : >vector ( seq -- vector ) V{ } clone-like ;

View File

@ -1396,7 +1396,7 @@ allot_bignum_zeroed(bignum_length_type length, int negative_p)
} }
#define BIGNUM_REDUCE_LENGTH(source, length) \ #define BIGNUM_REDUCE_LENGTH(source, length) \
source = reallot_array(source,length + 1,0) source = reallot_array(source,length + 1)
/* allocates memory */ /* allocates memory */
bignum_type bignum_type

View File

@ -157,27 +157,18 @@ CELL allot_array_4(CELL v1, CELL v2, CELL v3, CELL v4)
return tag_object(a); return tag_object(a);
} }
F_ARRAY *reallot_array(F_ARRAY* array, CELL capacity, CELL fill) F_ARRAY *reallot_array(F_ARRAY* array, CELL capacity)
{ {
int i;
F_ARRAY* new_array;
CELL to_copy = array_capacity(array); CELL to_copy = array_capacity(array);
if(capacity < to_copy) if(capacity < to_copy)
to_copy = capacity; to_copy = capacity;
REGISTER_UNTAGGED(array); REGISTER_UNTAGGED(array);
REGISTER_ROOT(fill); F_ARRAY* new_array = allot_array_internal(untag_header(array->header),capacity);
new_array = allot_array_internal(untag_header(array->header),capacity);
UNREGISTER_ROOT(fill);
UNREGISTER_UNTAGGED(array); UNREGISTER_UNTAGGED(array);
memcpy(new_array + 1,array + 1,to_copy * CELLS); memcpy(new_array + 1,array + 1,to_copy * CELLS);
memset((char *)AREF(new_array,to_copy),'\0',(capacity - to_copy) * CELLS);
for(i = to_copy; i < capacity; i++)
put(AREF(new_array,i),fill);
return new_array; return new_array;
} }
@ -186,7 +177,7 @@ void primitive_resize_array(void)
{ {
F_ARRAY* array = untag_array(dpop()); F_ARRAY* array = untag_array(dpop());
CELL capacity = unbox_array_size(); CELL capacity = unbox_array_size();
dpush(tag_object(reallot_array(array,capacity,F))); dpush(tag_object(reallot_array(array,capacity)));
} }
F_ARRAY *growable_array_add(F_ARRAY *result, CELL elt, CELL *result_count) F_ARRAY *growable_array_add(F_ARRAY *result, CELL elt, CELL *result_count)
@ -195,8 +186,7 @@ F_ARRAY *growable_array_add(F_ARRAY *result, CELL elt, CELL *result_count)
if(*result_count == array_capacity(result)) if(*result_count == array_capacity(result))
{ {
result = reallot_array(result, result = reallot_array(result,*result_count * 2);
*result_count * 2,F);
} }
UNREGISTER_ROOT(elt); UNREGISTER_ROOT(elt);
@ -214,7 +204,7 @@ F_ARRAY *growable_array_append(F_ARRAY *result, F_ARRAY *elts, CELL *result_coun
CELL new_size = *result_count + elts_size; CELL new_size = *result_count + elts_size;
if(new_size >= array_capacity(result)) if(new_size >= array_capacity(result))
result = reallot_array(result,new_size * 2,F); result = reallot_array(result,new_size * 2);
UNREGISTER_UNTAGGED(elts); UNREGISTER_UNTAGGED(elts);
@ -433,7 +423,7 @@ void primitive_string(void)
dpush(tag_object(allot_string(length,initial))); dpush(tag_object(allot_string(length,initial)));
} }
F_STRING* reallot_string(F_STRING* string, CELL capacity, CELL fill) F_STRING* reallot_string(F_STRING* string, CELL capacity)
{ {
CELL to_copy = string_capacity(string); CELL to_copy = string_capacity(string);
if(capacity < to_copy) if(capacity < to_copy)
@ -462,7 +452,7 @@ F_STRING* reallot_string(F_STRING* string, CELL capacity, CELL fill)
REGISTER_UNTAGGED(string); REGISTER_UNTAGGED(string);
REGISTER_UNTAGGED(new_string); REGISTER_UNTAGGED(new_string);
fill_string(new_string,to_copy,capacity,fill); fill_string(new_string,to_copy,capacity,'\0');
UNREGISTER_UNTAGGED(new_string); UNREGISTER_UNTAGGED(new_string);
UNREGISTER_UNTAGGED(string); UNREGISTER_UNTAGGED(string);
@ -473,7 +463,7 @@ void primitive_resize_string(void)
{ {
F_STRING* string = untag_string(dpop()); F_STRING* string = untag_string(dpop());
CELL capacity = unbox_array_size(); CELL capacity = unbox_array_size();
dpush(tag_object(reallot_string(string,capacity,0))); dpush(tag_object(reallot_string(string,capacity)));
} }
/* Some ugly macros to prevent a 2x code duplication */ /* Some ugly macros to prevent a 2x code duplication */

View File

@ -118,7 +118,7 @@ void primitive_tuple_layout(void);
void primitive_byte_array(void); void primitive_byte_array(void);
void primitive_clone(void); void primitive_clone(void);
F_ARRAY *reallot_array(F_ARRAY* array, CELL capacity, CELL fill); F_ARRAY *reallot_array(F_ARRAY* array, CELL capacity);
F_BYTE_ARRAY *reallot_byte_array(F_BYTE_ARRAY *array, CELL capacity); F_BYTE_ARRAY *reallot_byte_array(F_BYTE_ARRAY *array, CELL capacity);
void primitive_resize_array(void); void primitive_resize_array(void);
void primitive_resize_byte_array(void); void primitive_resize_byte_array(void);
@ -126,7 +126,7 @@ void primitive_resize_byte_array(void);
F_STRING* allot_string_internal(CELL capacity); F_STRING* allot_string_internal(CELL capacity);
F_STRING* allot_string(CELL capacity, CELL fill); F_STRING* allot_string(CELL capacity, CELL fill);
void primitive_string(void); void primitive_string(void);
F_STRING *reallot_string(F_STRING *string, CELL capacity, CELL fill); F_STRING *reallot_string(F_STRING *string, CELL capacity);
void primitive_resize_string(void); void primitive_resize_string(void);
F_STRING *memory_to_char_string(const char *string, CELL length); F_STRING *memory_to_char_string(const char *string, CELL length);
@ -177,7 +177,7 @@ F_ARRAY *growable_array_append(F_ARRAY *result, F_ARRAY *elts, CELL *result_coun
result = tag_object(growable_array_append(untag_object(result),elts,&result##_count)) result = tag_object(growable_array_append(untag_object(result),elts,&result##_count))
#define GROWABLE_ARRAY_TRIM(result) \ #define GROWABLE_ARRAY_TRIM(result) \
result = tag_object(reallot_array(untag_object(result),result##_count,F)) result = tag_object(reallot_array(untag_object(result),result##_count))
/* Macros to simulate a byte vector in C */ /* Macros to simulate a byte vector in C */
#define GROWABLE_BYTE_ARRAY(result) \ #define GROWABLE_BYTE_ARRAY(result) \