fast_require 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
File without changes
@@ -0,0 +1,11 @@
1
+ require 'jeweler'
2
+ Jeweler::Tasks.new do |s|
3
+ s.name = "fast_require"
4
+ s.summary = "A tool designed to speedup library loading in Ruby by caching library locations"
5
+ s.email = "rogerdpack@gmail.com"
6
+ s.homepage = "http://github.com/rdp/fast_ruby_require"
7
+ s.authors = ["Roger Pack"]
8
+ s.add_development_dependency 'rspec'
9
+ s.add_development_dependency 'sane'
10
+ # s.add_dependency
11
+ end
@@ -0,0 +1,8 @@
1
+ irb(main):001:0> $LOADED_FEATURES << 'abc.rb'
2
+ => ["enumerator.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/encdb.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/trans/transdb.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/iso_8859_1.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/rubygems.rb", "E:/installs/ruby191p376/lib/ruby/gems/1.9.1/gems/faster_rubygems-0.1.0/lib/faster_rubygems.rb", "E:/installs/ruby191p376/lib/ruby/gems/1.9.1/gems/faster_rubygems-0.1.0/lib/ubygemsf.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/rbconfig.rb", "E:/installs/ruby191p376/lib/ruby/gems/1.9.1/gems/backtracer-0.7.2/lib/shared.rb", "E:/installs/ruby191p376/lib/ruby/gems/1.9.1/gems/backtracer-0.7.2/lib/backtracer.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/e2mmap.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/init.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/workspace.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/context.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/extend-command.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/output-method.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/notifier.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/slex.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/ruby-token.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/ruby-lex.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/src_encoding.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/magic-file.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/euc_jp.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/shift_jis.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/etc.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/dl.so", "E:/installs/ruby191p376/lib/ruby/site_ruby/1.9.1/rbreadline.rb", "E:/installs/ruby191p376/lib/ruby/site_ruby/1.9.1/readline.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/input-method.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/locale.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb.rb", "abc.rb"]
3
+ irb(main):002:0> require 'abc'
4
+ => false
5
+
6
+ this could be optimized more for 1.9
7
+
8
+ Also, could loaded_features be made into a hash for much faster comparison?
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,63 @@
1
+ module FastRequire
2
+
3
+ @@loc = File.expand_path('~/.ruby_fast_require_location')
4
+ if File.exist? (@@loc)
5
+ @@require_locs = Marshal.restore( File.open(@@loc, 'rb') {|f| f.read})
6
+ else
7
+ @@require_locs = {}
8
+ end
9
+ @@already_loaded = {}
10
+ $LOADED_FEATURES.each{|loaded| @@already_loaded[loaded] = true}
11
+
12
+ at_exit {
13
+ FastRequire.save
14
+ }
15
+
16
+ def self.save
17
+ File.open(@@loc, 'wb'){|f| f.write Marshal.dump(@@require_locs)}
18
+ end
19
+
20
+ def self.clear!
21
+ require 'fileutils'
22
+ FileUtils.rm @@loc if File.exist? @@loc
23
+ @@require_locs.clear
24
+ end
25
+
26
+ def require_cached lib
27
+ if a = @@require_locs[lib]
28
+ return if @@already_loaded[a]
29
+ @@already_loaded[a] = true
30
+ if a =~ /.so$/
31
+ puts 'doing original require on full path' if $DEBUG
32
+ original_non_cached_require a # not much we can do there...too bad...
33
+ else
34
+ puts 'doing eval on ' + lib + '=>' + a if $DEBUG
35
+ eval(File.open(a, 'rb') {|f| f.read}, TOPLEVEL_BINDING, a) # note the b here--this means it's reading .rb files as binary, which *typically* works--if it breaks re-save the offending file in binary mode...
36
+ $LOADED_FEATURES << a
37
+ end
38
+ else
39
+ old = $LOADED_FEATURES.dup
40
+ if(original_non_cached_require lib)
41
+ new = $LOADED_FEATURES - old
42
+ @@require_locs[lib] = new.last
43
+ puts 'found new loc:' + lib + '=>' + @@require_locs[lib] if $DEBUG
44
+ @@already_loaded[@@require_locs[lib]] = true
45
+ end# how could this fail, though...
46
+ end
47
+
48
+ end
49
+ end
50
+
51
+ module Kernel
52
+
53
+ if(defined?(@already_using_fast_require))
54
+ raise 'cant require it twice...'
55
+ else
56
+ @already_using_fast_require = true
57
+ end
58
+
59
+ include FastRequire
60
+ # overwrite require...
61
+ alias :original_non_cached_require :require
62
+ alias :require :require_cached
63
+ end
@@ -0,0 +1 @@
1
+ require 'b'
@@ -0,0 +1,6 @@
1
+ puts 'in b.rb'
2
+ if defined?($b)
3
+ $b += 1
4
+ else
5
+ $b = 1
6
+ end
@@ -0,0 +1,5 @@
1
+ if defined?($c)
2
+ raise 'cannot require twice'
3
+ else
4
+ $c = true
5
+ end
@@ -0,0 +1,3 @@
1
+ require File.dirname(__FILE__) + "/../../lib/fast_require.rb"
2
+ require 'spec/autorun'
3
+ Spec
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'spec/autorun'
3
+ Spec
@@ -0,0 +1,95 @@
1
+ require 'faster_rubygems' if RUBY_VERSION < '1.9'
2
+ require_relative '../lib/fast_require'
3
+ require 'sane'
4
+ require 'spec/autorun'
5
+ require 'benchmark'
6
+ require 'spec/adapters/mock_frameworks/rspec'
7
+ #require 'ruby-debug'
8
+
9
+ #assert !defined?(FastRequire) # so that we can loadup our unit tests sanely, using the old way LOL.
10
+ require_relative '../lib/fast_require'
11
+
12
+ describe "faster requires" do
13
+
14
+ def with_file(filename = 'test')
15
+ FileUtils.touch filename + '.rb'
16
+ yield
17
+ FileUtils.rm filename + '.rb'
18
+ end
19
+
20
+ it "should be able to go one deep" do
21
+ Dir.chdir('files') do
22
+ assert require 'c'
23
+ assert !(require 'c')
24
+ end
25
+ end
26
+
27
+ it "should be able to go two deep, and once only" do
28
+ Dir.chdir('files') do
29
+ assert(require 'a_requires_b')
30
+ assert !(require 'a_requires_b')
31
+ assert !(require 'a_requires_b')
32
+ $b.should == 1
33
+ end
34
+ end
35
+
36
+ it "should be faster" do
37
+ Dir.chdir('files') do
38
+ #slow = Benchmark.realtime { system("#{OS.ruby_bin} slow.rb")}
39
+ #Benchmark.realtime { system("#{OS.ruby_bin} fast.rb")} # warmup
40
+ #fast = Benchmark.realtime { system("#{OS.ruby_bin} fast.rb")}
41
+ #pps 'fast', fast, 'slow', slow
42
+ #assert fast*2 < slow
43
+ end
44
+ end
45
+
46
+ it "should not save if it hasn't changed"
47
+ it "should cache when requires have already been done instead of calling require on them again"
48
+ it "should know which requires are currently active and avoid calling require on them again"
49
+
50
+ it "should have different based on $0"
51
+
52
+
53
+ it "should do two of the same requires" do
54
+ with_file('test') do
55
+ assert(require 'test')
56
+ assert(!(require 'test'))
57
+ end
58
+ end
59
+
60
+ before do # each
61
+ #FastRequire.clear!
62
+ end
63
+
64
+
65
+ it "should require files still" do
66
+ with_file('file1') { require 'file1'}
67
+ end
68
+
69
+ it "should require .so files still" do
70
+ # ruby-prof gem
71
+ 2.times { require 'ruby_prof' } # .so
72
+ end
73
+
74
+ it "should add them to $LOADED_FEATURES" do
75
+ with_file('file2') {require 'file2'}
76
+ assert ($LOADED_FEATURES.grep(/file2.rb/)).length > 0
77
+ end
78
+
79
+ it "should work with and without rubygems, esp. in 1.8" do
80
+ # run these tests in 1.8...hmm...
81
+ # maybe with and
82
+ end
83
+
84
+ it "should have a faster require method--faster, my friend, faster!"
85
+
86
+ it "should save a file" do
87
+ #FastRequire.clear!
88
+ loc = File.expand_path('~/.ruby_fast_require_location')
89
+ assert !File.exist?(loc)
90
+ FastRequire.save
91
+ assert File.exist?(loc)
92
+ end
93
+
94
+ it "should override the gem method"
95
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fast_require
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Roger Pack
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-18 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: sane
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ description:
36
+ email: rogerdpack@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README
43
+ files:
44
+ - README
45
+ - Rakefile
46
+ - TODO.LIST
47
+ - VERSION
48
+ - lib/fast_require.rb
49
+ - spec/files/a_requires_b.rb
50
+ - spec/files/b.rb
51
+ - spec/files/c.rb
52
+ - spec/files/fast.rb
53
+ - spec/files/slow.rb
54
+ - spec/spec.fast_require.rb
55
+ has_rdoc: true
56
+ homepage: http://github.com/rdp/fast_ruby_require
57
+ licenses: []
58
+
59
+ post_install_message:
60
+ rdoc_options:
61
+ - --charset=UTF-8
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: "0"
75
+ version:
76
+ requirements: []
77
+
78
+ rubyforge_project:
79
+ rubygems_version: 1.3.5
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: A tool designed to speedup library loading in Ruby by caching library locations
83
+ test_files:
84
+ - spec/files/a_requires_b.rb
85
+ - spec/files/b.rb
86
+ - spec/files/c.rb
87
+ - spec/files/fast.rb
88
+ - spec/files/slow.rb
89
+ - spec/spec.fast_require.rb