Issue #10212 has been updated by Eric Wong. SASADA Koichi <ko1 / atdot.net> wrote: > (2014/09/12 19:03), Eric Wong wrote: > > Yes, I think the following API is OK. rb_proc_t is big. > > The new inline rb_proc_alloc() takes 7(!) parameters. > > Maybe we can drop klass since that is always rb_cProc. > > Nice. > > Additionally, I recommend to move the definition from vm_core.h to vm.c OK, I think I'll move the inline to vm.c > (and expose it) because proc_dup() in proc.c is minor function. But exposing it seems worse, even. In other words: the new rb_proc_alloc is the wrong interface for rb_proc_dup. I like the following much more (still using rb_proc_wrap): --- a/proc.c +++ b/proc.c @@ -106,12 +106,13 @@ rb_obj_is_proc(VALUE proc) static VALUE proc_dup(VALUE self) { - rb_proc_t *src; + rb_proc_t *src, *dst; GetProcPtr(self, src); - return rb_proc_alloc(rb_cProc, &src->block, src->envval, src->blockprocval, - src->safe_level, src->is_from_method, src->is_lambda); + dst = ALLOC(rb_proc_t); + *dst = *src; + return rb_proc_wrap(rb_cProc, dst); } /* :nodoc: */ ---------------------------------------- Bug #10212: MRI is not for lambda calculus https://bugs.ruby-lang.org/issues/10212#change-48870 * Author: Koichi Sasada * Status: Open * Priority: Normal * Assignee: Koichi Sasada * Category: * Target version: current: 2.2.0 * ruby -v: ruby 2.2.0dev (2014-08-21 trunk 47241) [x86_64-linux] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- # title is joke. I added benchmark/bm_lc_fizzbuzz.rb which solve fizz buzz program by lambda calculus. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=47447 (This program is closly described by ["Understanding Computation"] (http://computationbook.com/) by Tom Stuart) ([Japanese translation of this book] (http://www.oreilly.co.jp/books/9784873116976/) will be published soon) The results of this program are: ``` jruby 1.7.12 (1.9.3p392) 2014-04-15 643e292 on OpenJDK 64-Bit Server VM 1.7.0_65-b32 [linux-amd64] real 0m26.648s user 0m30.091s sys 0m4.369s mruby 89e9df26819b9555fb790a16662f4ad2b9cbb2e2 real 0m27.145s user 0m27.110s sys 0m0.012s ruby 2.2.0dev (2014-08-21 trunk 47241) [x86_64-linux] real 1m54.648s user 1m54.512s sys 0m0.028s ``` It is clear that MRI is too slow. I haven't dig details, but maybe it is because of GC perforamance. Because Proc (and Env) objects are wb-unprotected, such objects are marked on every minor GC. This problem is not critical because MRI is not for lambda calculus :p but we can improve about it. -- https://bugs.ruby-lang.org/