[ruby-core:104739] [Ruby master Bug#10902] require("enumerator") scans LOAD_PATH 2x on every invocation
From:
nagachika00@...
Date:
2021-08-01 09:53:19 UTC
List:
ruby-core #104739
Issue #10902 has been updated by nagachika (Tomoyuki Chikanaga).
Backport changed from 2.7: REQUIRED, 3.0: REQUIRED to 2.7: REQUIRED, 3.0: DONE
ruby_3_0 6f4ab641bb1035c5811e42e43320112e4a502a0e merged revision(s) 345db8f2aa373a31c619c8f85bd372f0a20829c1.
----------------------------------------
Bug #10902: require("enumerator") scans LOAD_PATH 2x on every invocation
https://bugs.ruby-lang.org/issues/10902#change-93075
* Author: tmm1 (Aman Gupta)
* Status: Closed
* Priority: Normal
* ruby -v: ruby 2.1.5
* Backport: 2.7: REQUIRED, 3.0: DONE
----------------------------------------
On every invocation of `require "enumerator"` (for example during boot when many gems require it), the VM will scan the load path twice: once for enumerator.rb and again for enumerator.so. Of course, no file is found because enumerator is now shipped within the VM by default.
~~~
$ ruby -e' p $LOADED_FEATURES[0] '
"enumerator.so"
$ ruby -e' p $LOAD_PATH.size '
8
$ strace -e trace=open ruby -e' 1.times{ require "enumerator" } ' 2>&1 | grep enumerator.rb | wc -l
8
$ strace -e trace=open ruby -e' 1.times{ require "enumerator" } ' 2>&1 | grep enumerator.so | wc -l
8
$ strace -e trace=open ruby -e' 10.times{ require "enumerator" } ' 2>&1 | grep enumerator.so | wc -l
80
$ strace -e trace=open ruby -e' 100.times{ require "enumerator" } ' 2>&1 | grep enumerator.so | wc -l
800
~~~
In enumerator.c, we call `rb_provide("enumerator.so")` which adds it to $LOADED_FEATURES. This means `require "enumerator.so"` can be optimized, but most libraries do not include the .so extension when requiring enumerator.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>