Skip to content

Commit 818ee97

Browse files
committed
Generate text file only table
I'm using Stackprof for a performance check of CRuby documents generation. Before this commit, RDoc::TopLevel#text? uses processing time about 6.8%. ~/rdoc$ stackprof stackprof.dump --text --limit 5 ================================== Mode: cpu(1000) Samples: 42712 (0.47% miss rate) GC: 6066 (14.20%) ================================== TOTAL (pct) SAMPLES (pct) FRAME 6066 (14.2%) 6066 (14.2%) (garbage collection) 2892 (6.8%) 2892 (6.8%) RDoc::TopLevel#text? 14059 (32.9%) 2379 (5.6%) RDoc::Generator::Darkfish#generate_class 3015 (7.1%) 1389 (3.3%) Ripper::Lexer#lex 1265 (3.0%) 1265 (3.0%) Ripper::Lexer::State#initialize After this commit, processing time of RDoc::TopLevel#text? is reduced to 0.1%. ~/rdoc$ stackprof stackprof.dump --method 'RDoc::TopLevel#text?' RDoc::TopLevel#text? (/home/aycabta/rdoc/lib/rdoc/top_level.rb:274) samples: 20 self (0.1%) / 20 total (0.1%) callers: 17 ( 85.0%) RDoc::Generator::Darkfish#generate_page 2 ( 10.0%) RDoc::Store#add_file 1 ( 5.0%) RDoc::Store#complete
1 parent 0b39cca commit 818ee97

File tree

6 files changed

+29
-18
lines changed

6 files changed

+29
-18
lines changed

lib/rdoc/rdoc.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ def parse_file filename
355355
relative_path.relative_path_from @options.page_dir
356356
end
357357

358-
top_level = @store.add_file filename, relative_path.to_s
358+
top_level = @store.add_file filename, relative_name: relative_path.to_s
359359

360360
parser = RDoc::Parser.for top_level, filename, content, @options, @stats
361361

lib/rdoc/store.rb

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ def initialize path = nil, type = nil
148148
@classes_hash = {}
149149
@modules_hash = {}
150150
@files_hash = {}
151+
@text_files_hash = {}
151152

152153
@c_enclosure_classes = {}
153154
@c_enclosure_names = {}
@@ -184,16 +185,24 @@ def add_c_variables c_parser
184185
# Adds the file with +name+ as an RDoc::TopLevel to the store. Returns the
185186
# created RDoc::TopLevel.
186187

187-
def add_file absolute_name, relative_name = absolute_name
188+
def add_file absolute_name, relative_name: absolute_name, parser: nil
188189
unless top_level = @files_hash[relative_name] then
189190
top_level = RDoc::TopLevel.new absolute_name, relative_name
191+
top_level.parser = parser if parser
190192
top_level.store = self
191193
@files_hash[relative_name] = top_level
194+
@text_files_hash[relative_name] = top_level if top_level.text?
192195
end
193196

194197
top_level
195198
end
196199

200+
def update_parser_of_file(absolute_name, parser)
201+
if top_level = @files_hash[absolute_name] then
202+
@text_files_hash[absolute_name] = top_level if top_level.text?
203+
end
204+
end
205+
197206
##
198207
# Returns all classes discovered by RDoc
199208

@@ -428,8 +437,8 @@ def find_module_named name
428437
# +file_name+
429438

430439
def find_text_page file_name
431-
@files_hash.each_value.find do |file|
432-
file.text? and file.full_name == file_name
440+
@text_files_hash.each_value.find do |file|
441+
file.full_name == file_name
433442
end
434443
end
435444

@@ -537,6 +546,7 @@ def load_all
537546
@cache[:pages].each do |page_name|
538547
page = load_page page_name
539548
@files_hash[page_name] = page
549+
@text_files_hash[page_name] = page if page.text?
540550
end
541551
end
542552

@@ -712,8 +722,8 @@ def modules_hash
712722
# Returns the RDoc::TopLevel that is a text file and has the given +name+
713723

714724
def page name
715-
@files_hash.each_value.find do |file|
716-
file.text? and file.page_name == name
725+
@text_files_hash.each_value.find do |file|
726+
file.page_name == name
717727
end
718728
end
719729

lib/rdoc/top_level.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class RDoc::TopLevel < RDoc::Context
3333
##
3434
# The parser class that processed this file
3535

36-
attr_accessor :parser
36+
attr_reader :parser
3737

3838
##
3939
# Creates a new TopLevel for the file at +absolute_name+. If documentation
@@ -52,6 +52,12 @@ def initialize absolute_name, relative_name = absolute_name
5252
@classes_or_modules = []
5353
end
5454

55+
def parser=(val)
56+
@parser = val
57+
@store.update_parser_of_file(absolute_name, val) if @store
58+
@parser
59+
end
60+
5561
##
5662
# An RDoc::TopLevel is equal to another with the same relative_name
5763

test/test_rdoc_cross_reference.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ def test_resolve_method_equals3
162162
end
163163

164164
def test_resolve_page
165-
page = @store.add_file 'README.txt'
166-
page.parser = RDoc::Parser::Simple
165+
page = @store.add_file 'README.txt', parser: RDoc::Parser::Simple
167166

168167
assert_ref page, 'README'
169168
end

test/test_rdoc_servlet.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,7 @@ def test_documentation_page_page
224224

225225
generator = @s.generator_for store
226226

227-
readme = store.add_file 'README.rdoc'
228-
readme.parser = RDoc::Parser::Simple
227+
readme = store.add_file 'README.rdoc', parser: RDoc::Parser::Simple
229228

230229
@s.documentation_page store, generator, 'README_rdoc.html', @req, @res
231230

test/test_rdoc_store.rb

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ def setup
1414

1515
@top_level = @s.add_file 'file.rb'
1616

17-
@page = @s.add_file 'README.txt'
18-
@page.parser = RDoc::Parser::Simple
17+
@page = @s.add_file 'README.txt', parser: RDoc::Parser::Simple
1918
@page.comment = RDoc::Comment.new 'This is a page', @page
2019

2120
@klass = @top_level.add_class RDoc::NormalClass, 'Object'
@@ -146,7 +145,7 @@ def test_add_file
146145
end
147146

148147
def test_add_file_relative
149-
top_level = @store.add_file 'path/file.rb', 'file.rb'
148+
top_level = @store.add_file 'path/file.rb', relative_name: 'file.rb'
150149

151150
assert_kind_of RDoc::TopLevel, top_level
152151
assert_equal @store, top_level.store
@@ -310,8 +309,7 @@ def test_find_module_named
310309
end
311310

312311
def test_find_text_page
313-
page = @store.add_file 'PAGE.txt'
314-
page.parser = RDoc::Parser::Simple
312+
page = @store.add_file 'PAGE.txt', parser: RDoc::Parser::Simple
315313

316314
assert_nil @store.find_text_page 'no such page'
317315

@@ -601,8 +599,7 @@ def test_module_names
601599
end
602600

603601
def test_page
604-
page = @store.add_file 'PAGE.txt'
605-
page.parser = RDoc::Parser::Simple
602+
page = @store.add_file 'PAGE.txt', parser: RDoc::Parser::Simple
606603

607604
assert_nil @store.page 'no such page'
608605

0 commit comments

Comments
 (0)