Skip to content
  • Yusuke Endoh's avatar
    f71bd747
    RDoc::Parser::C: Integrate do_classes and do_modules by one regexp match · f71bd747
    Yusuke Endoh authored
    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
    f71bd747
    RDoc::Parser::C: Integrate do_classes and do_modules by one regexp match
    Yusuke Endoh authored
    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
Loading