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:
normal 2014-09-12 09:22:18 +00:00
parent b41909f603
commit ea6de7a2e2
2 changed files with 19 additions and 16 deletions

View File

@ -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
View File

@ -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 */