Forum: Ruby Multiple "require" calls -> app slow to start

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Philippe L. (Guest)
on 2007-02-06 10:12
(Received via mailing list)
Hi,

More and more files are being added to my client ruby application, and
it is getting quite slow to start, even on a fast machine. It takes
about 15 seconds in some cases.

The problem is with the call to "require" for the application
"workspace" object. This "require" points to files which in turn call
"require" for other files, and so on.

Is there a way to speed up the application load time maybe?

Thanks,
Mauricio F. (Guest)
on 2007-02-06 11:58
(Received via mailing list)
On Tue, Feb 06, 2007 at 05:10:58PM +0900, Philippe L. wrote:
> More and more files are being added to my client ruby application, and
> it is getting quite slow to start, even on a fast machine. It takes
> about 15 seconds in some cases.
>
> The problem is with the call to "require" for the application
> "workspace" object. This "require" points to files which in turn call
> "require" for other files, and so on.
>
> Is there a way to speed up the application load time maybe?

Are you loading files managed by RubyGems?
RubyGems' #require implementation is known to be very slow. Things
playing
against you include:
* required files from many different gems
* lots of installed gems

You can try to uninstall some gems (for instance unused, old versions),
or
hardcode the require paths:

  prefix = "/usr/local"
  %w[foo-0.1.1/lib bar-0.1/lib].each do |dir|
    $:.unshift "#{prefix}/lib/ruby/gems/1.8/gems/#{dir}"
  end

Another thing that can help (in general, not only when you're using
RubyGems)
is lazy loading using Kernel#autoload.
gga (Guest)
on 2007-02-07 19:36
(Received via mailing list)
>
> Another thing that can help (in general, not only when you're using RubyGems)
> is lazy loading using Kernel#autoload.
>

Similar to autoload, but manually doing it (keeping all of rubygems
functionality) is to do your requires within functions that use the
library.
Thus, rather than doing:

require 'mylib'

def use_it
     MyLib.new
end

Write:

def use_it
    require 'mylib'
    MyLib.new
end

Only when use_it is called will the require be executed.  If your code
never calls use_it, the mylib library is never loaded.
This topic is locked and can not be replied to.