from: opal/opal#1653
commit 447e1b4cb313de4bd416f1184b27fcee8cd5edd8
Author: Elia Schito <elia@schito.me>
Date: Wed Apr 12 00:00:35 2017 +0200
Establish a constant lookup IPS benchmark
bundle exec opal -ropal/platform -gbenchmark-ips -rbenchmark/ips -A /Users/elia/Code/opal/benchmark-ips/bm_constants_lookup.rb
Warming up --------------------------------------
Kernel 26.286k i/100ms
::Kernel 26.547k i/100ms
B 24.406k i/100ms
B::C 23.660k i/100ms
Calculating -------------------------------------
Kernel 2.566M (± 7.4%) i/s - 12.749M in 4.998786s
::Kernel 3.589M (± 8.2%) i/s - 17.786M in 4.996683s
B 1.507M (± 6.6%) i/s - 7.517M in 5.012634s
B::C 1.401M (± 6.2%) i/s - 6.980M in 5.003246s
Comparison:
::Kernel: 3588532.5 i/s
Kernel: 2566471.4 i/s - 1.40x slower
B: 1506741.2 i/s - 2.38x slower
B::C: 1400891.8 i/s - 2.56x slower
commit 547ddd43bf7fdd11505defc1c4c621c2a424c101
Author: Elia Schito <elia@schito.me>
Date: Tue Apr 11 09:05:15 2017 +0000
Rewrite the constants system
Still needs some fixes for proper autoloading checks and to go back to
acceptable speed.
Special thanks to:
- The Rails autoloading guide (http://guides.rubyonrails.org/v5.0/autoloading_and_reloading_constants.html)
- @ ConradIrwin's 2012 post on “Everything you ever wanted to know about constant lookup in Ruby” (http://cirw.in/blog/constant-lookup.html)
bundle exec opal -ropal/platform -gbenchmark-ips -rbenchmark/ips -A /Users/elia/Code/opal/benchmark-ips/bm_constants_lookup.rb
Warming up --------------------------------------
Kernel 5.589k i/100ms
::Kernel 6.661k i/100ms
B 6.581k i/100ms
B::C 6.604k i/100ms
Calculating -------------------------------------
Kernel 348.624k (± 6.6%) i/s - 1.738M in 5.009213s
::Kernel 6.576M (±10.4%) i/s - 31.926M in 4.923825s
B 3.900M (± 9.9%) i/s - 19.072M in 4.954285s
B::C 3.306M (±10.0%) i/s - 16.186M in 4.960673s
Comparison:
::Kernel: 6576348.2 i/s
B: 3900073.1 i/s - 1.69x slower
B::C: 3305787.1 i/s - 1.99x slower
Kernel: 348624.0 i/s - 18.86x slower
commit effc86f757846bd177fa2e5e943ee7e879f8d7f8
Author: Elia Schito <elia@schito.me>
Date: Tue Apr 11 21:58:09 2017 +0000
Use a weak constant cache
- It will expire every time a constant is defined, removed or set.
- For relative lookups the cache will be held on the current nesting.
- For qualified lookups the cache will be held on the current cref.
- Only the referenced constants will be cached.
There's a slight risk of memory leak if constants are set dynamically
and their unreferenced, but seems a good overall compromise that can
only be resolved by a WeakRef JS implementation.
bundle exec opal -ropal/platform -gbenchmark-ips -rbenchmark/ips -A /Users/elia/Code/opal/benchmark-ips/bm_constants_lookup.rb
Warming up --------------------------------------
Kernel 100.685k i/100ms
::Kernel 98.575k i/100ms
B 99.922k i/100ms
B::C 91.044k i/100ms
Calculating -------------------------------------
Kernel 6.930M (± 7.5%) i/s - 34.434M in 5.004191s
::Kernel 6.611M (± 5.3%) i/s - 33.023M in 5.010747s
B 7.259M (± 6.0%) i/s - 36.172M in 5.002918s
B::C 5.212M (± 6.5%) i/s - 25.948M in 5.001865s
Comparison:
B: 7259023.0 i/s
Kernel: 6929763.2 i/s - same-ish: difference falls within error
::Kernel: 6611188.0 i/s - same-ish: difference falls within error
B::C: 5211583.8 i/s - 1.39x slower
it's a 50% to almost 80% improvement