From: Yura Sokolov Date: 2011-11-01T14:40:13+09:00 Subject: [ruby-core:40608] [ruby-trunk - Feature #5427] Not complex patch to improve `require` time (load.c) Issue #5427 has been updated by Yura Sokolov. Thomas Sawyer wrote: > "After this patch `loaded_features` is kept sorted by basename without extension (/usr/lib/ruby/asdf.rb => asdf). When `rb_feature_p` start its check, it goes straight to the first item with matching basename (using binary search) and stops after last." > > If I understand this correctly, this is not good behavior. See http://redmine.ruby-lang.org/issues/4969 Patch preserves `require` behaviour because it doesn't remove any checks against path or extension. #4969 remains as it should, cause require system or ruby 1.9 were created to prevent such cases (if I understand correctly). One should put file in a unambiguous path (`lib/wedge/abbrev.rb`) and then require from there (`require 'wedge/abbrev'`) > If you guys are worried about load speed, there are two things that can be done that will speed up things more than anything else. 1) use relative require in your libraries. That's easy, but it's up to the end developer. In fact, be present relative require is twice slower (in 1.9.2, 1.9.3), cause ruby checks such file before and after path expansion. ---------------------------------------- Feature #5427: Not complex patch to improve `require` time (load.c) http://redmine.ruby-lang.org/issues/5427 Author: Yura Sokolov Status: Open Priority: Normal Assignee: Category: Target version: Currently `loaded_features` are unsorted, so that `rb_feature_p` ought to iterate over all `loaded_features` to figure: is requested feature loaded? After this patch `loaded_features` is kept sorted by basename without extension (/usr/lib/ruby/asdf.rb => asdf). When `rb_feature_p` start its check, it goes straight to the first item with matching basename (using binary search) and stops after last. Methods `$LOADED_FEATURES.<<` and `$LOADED_FEATURES.push` are overriden to keep sort order. `push` accepts only 1 parameter, but it seems that no one pass more to it. Currently I choose to consider characters of basename in right to left order, but it could be changed, I think. https://gist.github.com/1272991 https://github.com/ruby/ruby/pull/51 -- http://redmine.ruby-lang.org