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/