Project

General

Profile

Backport #2723

Updated by knu (Akinori MUSHA) over 6 years ago

=begin 
  
  This occurs on 1.8.6, 1.8.7 and 1.9.1. 
 
  The Kernel#require docs say: 'A feature will not be loaded if it‘s name already appears in $"."'. However, re-requiring the same file still scans all the load paths in $: even if the file will not be loaded. 
 
  This is exceedingly problematic on Windows, where stat()ing the list of all paths becomes very slow very quickly: 
 
  $:.length: 9,      0.005000 seconds 
  $:.length: 12,     0.005690 seconds 
  $:.length: 21,     0.010520 seconds 
  $:.length: 48,     0.022430 seconds 
  $:.length: 129,    0.062840 seconds 
  $:.length: 372,    0.179510 seconds 
  $:.length: 1101, 0.517070 seconds 
 
  Since it is not possible to create a new file called "set.rb" (or even "set.so", "set.o" and "set.dll" etc) somewhere else in the load path and have "require 'set'" pickup that new file, is it really necessary to scan the paths? 
 
  Specifying "require 'set.rb'" by hand works quickly. 
 
  $:.length: 9,      0.000030 seconds 
  $:.length: 12,     0.000030 seconds 
  $:.length: 21,     0.000030 seconds 
  $:.length: 48,     0.000030 seconds 
  $:.length: 129,    0.000030 seconds 
  $:.length: 372,    0.000030 seconds 
  $:.length: 1101, 0.000030 seconds 
 
  But it is very unlikely everyone will switch their require lines. 
 
  There are many solutions to this problem, depending on what the intended behavior is. The current solution is a significant source of wasted time when requiring a large code base. My application takes 20 full seconds of require time which are eliminated by hacking this extra scan step out. ($:.length == 169, $".length == 993) 
 
 =end 
 

Back