Project

General

Profile

« Previous | Next » 

Revision f71bd747

Added by mame (Yusuke Endoh) about 6 years ago

RDoc::Parser::C: Integrate do_classes and do_modules by one regexp match

The full scan of the C source code (@content.scan) is very slow.
The old code invokes the scan six times in do_classes and
do_modules.

This change integrates the six scans into one by merging the regexps.
The integrated regexp is a bit hard to maintain, but the speed up is
significant: approx. 30 sec -> 20 sec in Ruby's make rdoc.

In addition, this change omits do_boot_defclass unless the file name
is class.c. boot_defclass is too specific to Ruby's source code, so
RDoc should handle it as a special case.

Before this change:

 TOTAL (pct) SAMPLES (pct) FRAME 858 (13.6%) 858 (13.6%) (garbage collection) 292 (4.6%) 264 (4.2%) RDoc::Parser::C#do_define_class 263 (4.2%) 250 (3.9%) RDoc::Parser::C#do_define_module 275 (4.3%) 241 (3.8%) RDoc::Parser::C#do_define_class_under 248 (3.9%) 237 (3.7%) RDoc::Parser::C#do_define_module_under 234 (3.7%) 234 (3.7%) RDoc::Parser::C#gen_body_table 219 (3.5%) 219 (3.5%) Ripper::Lexer#state_obj 217 (3.4%) 216 (3.4%) RDoc::Parser::C#do_struct_define_without_accessor 205 (3.2%) 205 (3.2%) RDoc::Parser::C#do_boot_defclass 205 (3.2%) 205 (3.2%) RDoc::Parser::C#do_singleton_class 

The six methods take approx. 22.2%.
do_define_class (4.2%) + do_define_class_under (3.8%) +
do_define_module (3,9$) + do_define_module_under (3.7%) +
do_struct_define_without_accessor (3.4%) + do_singleton_class (3.2%)

After this change, the methods are integrated to do_classes_and_modules
which takes only 5.8%.

 TOTAL (pct) SAMPLES (pct) FRAME 812 (16.7%) 812 (16.7%) (garbage collection) 355 (7.3%) 284 (5.8%) RDoc::Parser::C#do_classes_and_modules 225 (4.6%) 225 (4.6%) RDoc::Parser::C#gen_body_table 429 (8.8%) 210 (4.3%) RDoc::Parser::RubyTools#get_tk 208 (4.3%) 208 (4.3%) RDoc::TokenStream#add_tokens