tried performance optimization
This commit is contained in:
		| @ -244,12 +244,16 @@ struct ase_awk_run_t | ||||
| 	ase_size_t stack_limit; | ||||
| 	int exit_level; | ||||
|  | ||||
| 	ase_awk_val_int_t* icache[200]; /* TODO: choose the optimal size  */ | ||||
| 	ase_awk_val_real_t* rcache[200]; /* TODO: choose the optimal size  */ | ||||
| 	ase_awk_val_ref_t* fcache[200]; /* TODO: choose the optimal size */ | ||||
| 	ase_awk_val_int_t* icache[128]; | ||||
| 	ase_awk_val_real_t* rcache[128]; | ||||
| 	ase_awk_val_ref_t* fcache[128]; | ||||
| 	ase_awk_val_str_t* scache32[128]; | ||||
| 	ase_awk_val_str_t* scache64[128]; | ||||
| 	ase_size_t icache_count; | ||||
| 	ase_size_t rcache_count; | ||||
| 	ase_size_t fcache_count; | ||||
| 	ase_size_t scache32_count; | ||||
| 	ase_size_t scache64_count; | ||||
|  | ||||
| 	ase_awk_nde_blk_t* active_block; | ||||
| 	ase_byte_t* pattern_range_state; | ||||
|  | ||||
| @ -745,6 +745,8 @@ static int init_run ( | ||||
| 	run->icache_count = 0; | ||||
| 	run->rcache_count = 0; | ||||
| 	run->fcache_count = 0; | ||||
| 	run->scache32_count = 0; | ||||
| 	run->scache64_count = 0; | ||||
|  | ||||
| 	run->errnum = ASE_AWK_ENOERR; | ||||
| 	run->errlin = 0; | ||||
| @ -962,6 +964,18 @@ static void deinit_run (ase_awk_run_t* run) | ||||
| 		ase_awk_val_ref_t* tmp = run->fcache[--run->fcache_count]; | ||||
| 		ase_awk_freeval (run, (ase_awk_val_t*)tmp, ase_false); | ||||
| 	} | ||||
|  | ||||
| 	while (run->scache32_count > 0) | ||||
| 	{ | ||||
| 		ase_awk_val_str_t* tmp = run->scache32[--run->scache32_count]; | ||||
| 		ase_awk_freeval (run, (ase_awk_val_t*)tmp, ase_false); | ||||
| 	} | ||||
|  | ||||
| 	while (run->scache64_count > 0) | ||||
| 	{ | ||||
| 		ase_awk_val_str_t* tmp = run->scache64[--run->scache64_count]; | ||||
| 		ase_awk_freeval (run, (ase_awk_val_t*)tmp, ase_false); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static int build_runarg ( | ||||
|  | ||||
| @ -133,17 +133,38 @@ ase_awk_val_t* ase_awk_makestrval ( | ||||
| 	ase_awk_run_t* run, const ase_char_t* str, ase_size_t len) | ||||
| { | ||||
| 	ase_awk_val_str_t* val; | ||||
| 	ase_size_t rlen = len; | ||||
|  | ||||
| 	if (rlen <= 32) | ||||
| 	{ | ||||
| 		if (run->scache32_count > 0) | ||||
| 		{ | ||||
| 			val = run->scache32[--run->scache32_count]; | ||||
| 			goto init; | ||||
| 		} | ||||
| 		rlen = 32; | ||||
| 	} | ||||
| 	else if (rlen <= 64) | ||||
| 	{ | ||||
| 		if (run->scache64_count > 0) | ||||
| 		{ | ||||
| 			val = run->scache64[--run->scache64_count]; | ||||
| 			goto init; | ||||
| 		} | ||||
| 		rlen = 64; | ||||
| 	} | ||||
| 	 | ||||
| 	val = (ase_awk_val_str_t*) ASE_AWK_MALLOC ( | ||||
| 		run->awk,  | ||||
| 		ASE_SIZEOF(ase_awk_val_str_t) +  | ||||
| 		(len+1)*ASE_SIZEOF(ase_char_t)); | ||||
| 		(rlen+1)*ASE_SIZEOF(ase_char_t)); | ||||
| 	if (val == ASE_NULL)  | ||||
| 	{ | ||||
| 		ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | ||||
| 		return ASE_NULL; | ||||
| 	} | ||||
|  | ||||
| init: | ||||
| 	val->type = ASE_AWK_VAL_STR; | ||||
| 	val->ref = 0; | ||||
| 	val->len = len; | ||||
| @ -183,17 +204,38 @@ ase_awk_val_t* ase_awk_makestrval2 ( | ||||
| 	const ase_char_t* str2, ase_size_t len2) | ||||
| { | ||||
| 	ase_awk_val_str_t* val; | ||||
| 	ase_size_t rlen = len1 + len2; | ||||
|  | ||||
| 	if (rlen <= 32) | ||||
| 	{ | ||||
| 		if (run->scache32_count > 0) | ||||
| 		{ | ||||
| 			val = run->scache32[--run->scache32_count]; | ||||
| 			goto init; | ||||
| 		} | ||||
| 		rlen = 32; | ||||
| 	} | ||||
| 	else if (rlen <= 64) | ||||
| 	{ | ||||
| 		if (run->scache64_count > 0) | ||||
| 		{ | ||||
| 			val = run->scache64[--run->scache64_count]; | ||||
| 			goto init; | ||||
| 		} | ||||
| 		rlen = 64; | ||||
| 	} | ||||
|  | ||||
| 	val = (ase_awk_val_str_t*) ASE_AWK_MALLOC ( | ||||
| 		run->awk,  | ||||
| 		ASE_SIZEOF(ase_awk_val_str_t) + | ||||
| 		(len1+len2+1)*ASE_SIZEOF(ase_char_t)); | ||||
| 		(rlen+1)*ASE_SIZEOF(ase_char_t)); | ||||
| 	if (val == ASE_NULL)  | ||||
| 	{ | ||||
| 		ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | ||||
| 		return ASE_NULL; | ||||
| 	} | ||||
|  | ||||
| init: | ||||
| 	val->type = ASE_AWK_VAL_STR; | ||||
| 	val->ref = 0; | ||||
| 	val->len = len1 + len2; | ||||
| @ -343,8 +385,7 @@ void ase_awk_freeval (ase_awk_run_t* run, ase_awk_val_t* val, ase_bool_t cache) | ||||
| 	} | ||||
| 	else if (val->type == ASE_AWK_VAL_INT) | ||||
| 	{ | ||||
| 		if (cache == ase_true && | ||||
| 		    run->icache_count < ASE_COUNTOF(run->icache)) | ||||
| 		if (cache && run->icache_count < ASE_COUNTOF(run->icache)) | ||||
| 		{ | ||||
| 			run->icache[run->icache_count++] =  | ||||
| 				(ase_awk_val_int_t*)val;	 | ||||
| @ -353,8 +394,7 @@ void ase_awk_freeval (ase_awk_run_t* run, ase_awk_val_t* val, ase_bool_t cache) | ||||
| 	} | ||||
| 	else if (val->type == ASE_AWK_VAL_REAL) | ||||
| 	{ | ||||
| 		if (cache == ase_true && | ||||
| 		    run->rcache_count < ASE_COUNTOF(run->rcache)) | ||||
| 		if (cache && run->rcache_count < ASE_COUNTOF(run->rcache)) | ||||
| 		{ | ||||
| 			run->rcache[run->rcache_count++] =  | ||||
| 				(ase_awk_val_real_t*)val;	 | ||||
| @ -364,7 +404,22 @@ void ase_awk_freeval (ase_awk_run_t* run, ase_awk_val_t* val, ase_bool_t cache) | ||||
| 	else if (val->type == ASE_AWK_VAL_STR) | ||||
| 	{ | ||||
| 		/*ASE_AWK_FREE (run->awk, ((ase_awk_val_str_t*)val)->buf);*/ | ||||
| 		ASE_AWK_FREE (run->awk, val); | ||||
| 		if (cache) | ||||
| 		{ | ||||
| 			ase_awk_val_str_t* v = (ase_awk_val_str_t*)val; | ||||
| 			if (v->len <= 32 &&  | ||||
| 			    run->scache32_count<ASE_COUNTOF(run->scache32)) | ||||
| 			{ | ||||
| 				run->scache32[run->scache32_count++] = v; | ||||
| 			} | ||||
| 			else if (v->len <= 64 &&  | ||||
| 			         run->scache64_count<ASE_COUNTOF(run->scache64)) | ||||
| 			{ | ||||
| 				run->scache64[run->scache64_count++] = v; | ||||
| 			} | ||||
| 			else ASE_AWK_FREE (run->awk, val); | ||||
| 		} | ||||
| 		else ASE_AWK_FREE (run->awk, val); | ||||
| 	} | ||||
| 	else if (val->type == ASE_AWK_VAL_REX) | ||||
| 	{ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user