From: michaelvasin@... Date: 2018-05-01T17:02:55+00:00 Subject: [ruby-core:86803] [Ruby trunk Bug#10212] MRI is not for lambda calculus Issue #10212 has been updated by mvasin (Mikhail Vasin). I guess this is related, so I'll post it here. Today I tried this code sample in MRI 2.5 ``` fib = lambda {|x| return x if x == 0 || x == 1; fib.call(x-1) + fib.call(x-2)}; t = Time.now; fib.call(40); puts Time.now - t ``` and an equivalent piece in node.js: ``` function fib(n) {if (n === 0 || n === 1) return n; return fib(n-1) + fib(n-2)}; t = new Date; fib(40); console.log(new Date - t) ``` MRI's Fibonacci runs for 35,5 seconds, while Node.js does the job in 1,084 seconds. One can think that JavaSscript is 35,5 times faster then Ruby... Of course, you can calculate Fibonacci without recursion and it will be much faster, but I'm curious if there's anything that can be done to improve the performance in this particular case. BTW, JRuby runs this code for 175,6 seconds on my computer. 162 times slower than Node. Wow. ---------------------------------------- Bug #10212: MRI is not for lambda calculus https://bugs.ruby-lang.org/issues/10212#change-71766 * Author: ko1 (Koichi Sasada) * Status: Closed * Priority: Normal * Assignee: ko1 (Koichi Sasada) * Target version: * 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/ Unsubscribe: