mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	vm.c (env_alloc): inline to avoid extra zeroing
tiny speedup [ruby-core:64980] benchmark results: Execution time (sec) name trunk built app_lc_fizzbuzz 100.411 98.692 Speedup ratio: compare with the result of `trunk' (greater is better) name built app_lc_fizzbuzz 1.017 rb_proc_alloc changes will give more git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47552 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									b41909f603
								
							
						
					
					
						commit
						ea6de7a2e2
					
				
					 2 changed files with 19 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,8 @@
 | 
			
		|||
Fri Sep 12 18:14:28 2014  Eric Wong  <e@80x24.org>
 | 
			
		||||
 | 
			
		||||
	* vm.c (env_alloc): inline to avoid extra zeroing
 | 
			
		||||
	  tiny speedup [ruby-core:64980]
 | 
			
		||||
 | 
			
		||||
Fri Sep 12 17:13:29 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* vm_method.c (rb_method_entry_make, remove_method): ditto.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										30
									
								
								vm.c
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								vm.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -404,18 +404,6 @@ static const rb_data_type_t env_data_type = {
 | 
			
		|||
    NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
env_alloc(int local_size)
 | 
			
		||||
{
 | 
			
		||||
    rb_env_t *env;
 | 
			
		||||
 | 
			
		||||
    env = xcalloc(1, sizeof(rb_env_t) + ((local_size + 1) * sizeof(VALUE)));
 | 
			
		||||
    env->env_size = local_size + 1 + 1;
 | 
			
		||||
    env->local_size = local_size;
 | 
			
		||||
 | 
			
		||||
    return TypedData_Wrap_Struct(rb_cEnv, &env_data_type, env);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static VALUE check_env_value(VALUE envval);
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
| 
						 | 
				
			
			@ -488,10 +476,9 @@ vm_make_env_each(const rb_thread_t *const th, rb_control_frame_t *const cfp,
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    /* allocate env */
 | 
			
		||||
    envval = env_alloc(local_size);
 | 
			
		||||
    GetEnvPtr(envval, env);
 | 
			
		||||
 | 
			
		||||
    env->prev_envval = penvval;
 | 
			
		||||
    env = xmalloc(sizeof(rb_env_t) + ((local_size + 1) * sizeof(VALUE)));
 | 
			
		||||
    env->env_size = local_size + 1 + 1;
 | 
			
		||||
    env->local_size = local_size;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i <= local_size; i++) {
 | 
			
		||||
	env->env[i] = envptr[-local_size + i];
 | 
			
		||||
| 
						 | 
				
			
			@ -504,6 +491,15 @@ vm_make_env_each(const rb_thread_t *const th, rb_control_frame_t *const cfp,
 | 
			
		|||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* be careful not to trigger GC after this */
 | 
			
		||||
    envval = TypedData_Wrap_Struct(rb_cEnv, &env_data_type, env);
 | 
			
		||||
 | 
			
		||||
   /*
 | 
			
		||||
    * must happen after TypedData_Wrap_Struct to ensure penvval is markable
 | 
			
		||||
    * in case object allocation triggers GC and clobbers penvval.
 | 
			
		||||
    */
 | 
			
		||||
    env->prev_envval = penvval;
 | 
			
		||||
 | 
			
		||||
    *envptr = envval;		/* GC mark */
 | 
			
		||||
    nenvptr = &env->env[i - 1];
 | 
			
		||||
    nenvptr[1] = envval;	/* frame self */
 | 
			
		||||
| 
						 | 
				
			
			@ -513,8 +509,10 @@ vm_make_env_each(const rb_thread_t *const th, rb_control_frame_t *const cfp,
 | 
			
		|||
 | 
			
		||||
    /* as Binding */
 | 
			
		||||
    env->block.self = cfp->self;
 | 
			
		||||
    env->block.klass = 0;
 | 
			
		||||
    env->block.ep = cfp->ep;
 | 
			
		||||
    env->block.iseq = cfp->iseq;
 | 
			
		||||
    env->block.proc = 0;
 | 
			
		||||
 | 
			
		||||
    if (!RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
 | 
			
		||||
	/* TODO */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue