premailer / css_parser

Ruby CSS Parser
Other
279 stars 110 forks source link

Memory and Performance Optimization #91

Closed chopraanmol1 closed 5 years ago

chopraanmol1 commented 6 years ago

Tested on ruby 2.3.1 ( with https://dialect.ca/inc/screen.css ) for https://github.com/premailer/css_parser/issues/92

Script

require 'memory_profiler'

report = MemoryProfiler.report do
  CssParser::Parser.new.load_uri!("file:///home/*****/Documents/screen.css")
end

report.pretty_print

Previous

Total allocated: 2208154 bytes (23505 objects)
Total retained:  0 bytes (0 objects)

allocated memory by gem
-----------------------------------
   2200965  css_parser/lib
      7037  addressable-2.5.2
       152  other

allocated memory by file
-----------------------------------
   1570459  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb
    609546  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb
     20960  /home/anmol/Documents/work/css_parser/lib/css_parser.rb
      7037  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb
       152  (irb)

allocated memory by location
-----------------------------------
   1099796  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:327
    151349  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:349
    141963  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:514
     98312  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:501
     69368  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:64
     67826  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:493
     64044  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:352
     58840  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:502
     40960  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:351
     40960  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:403
     40403  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:496
     35256  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:408
     32176  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:489
     29696  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:189
     23920  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:61
     21702  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:525
     20960  /home/anmol/Documents/work/css_parser/lib/css_parser.rb:163
     19881  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:533
     15360  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:187
     15333  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:356
     13578  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:60
     11960  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:497
     11960  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:505
     11960  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:59
     11920  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:63
     10689  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:541
      9216  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:167
      5120  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:364
      5120  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:365
      5120  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:17
      5120  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:19
      5120  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:495
      2080  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:333
      1927  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:107
      1376  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:136
      1064  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:43
       960  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:873
       576  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1323
       464  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:117
       384  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:796
       360  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:578
       320  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1814
       320  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2428
       232  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:37
       232  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:40
       232  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:437
       214  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2304
       160  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2422
       152  (irb):13
       120  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:118

allocated memory by class
-----------------------------------
    957040  MatchData
    823122  String
    278328  Array
    139536  Hash
      9216  CssParser::RuleSet
       240  File
       224  RubyVM::Env
       176  Addressable::URI
       160  Proc
       112  CssParser::Parser

allocated objects by gem
-----------------------------------
     23423  css_parser/lib
        80  addressable-2.5.2
         2  other

allocated objects by file
-----------------------------------
     15123  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb
      7776  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb
       524  /home/anmol/Documents/work/css_parser/lib/css_parser.rb
        80  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb
         2  (irb)

allocated objects by location
-----------------------------------
     10358  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:327
      1962  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:514
      1795  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:349
      1196  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:502
       730  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:408
       598  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:501
       598  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:61
       556  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:496
       551  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:493
       549  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:352
       524  /home/anmol/Documents/work/css_parser/lib/css_parser.rb:163
       384  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:187
       309  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:60
       299  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:497
       299  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:505
       299  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:59
       299  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:64
       298  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:63
       256  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:351
       256  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:403
       165  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:356
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:167
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:189
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:364
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:365
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:17
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:19
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:489
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:495
        52  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:333
        19  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:107
        10  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:525
         9  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:533
         8  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1814
         8  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2428
         6  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:873
         5  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:541
         4  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:578
         4  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1323
         4  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:136
         4  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2422
         4  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:796
         3  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:118
         3  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:119
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1529
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2304
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2305
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2306
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:877
         2  (irb):13

allocated objects by class
-----------------------------------
     15382  String
      3873  Array
      3418  MatchData
       696  Hash
       128  CssParser::RuleSet
         2  Addressable::URI
         2  Proc
         2  RubyVM::Env
         1  CssParser::Parser
         1  File

Current


Total allocated: 951463 bytes (8868 objects)
Total retained:  0 bytes (0 objects)

allocated memory by gem
-----------------------------------
    941932  css_parser/lib
      8357  addressable-2.5.2
      1014  rubygems
       160  other

allocated memory by file
-----------------------------------
    489937  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb
    441515  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb
     10480  /home/anmol/Documents/work/css_parser/lib/css_parser.rb
      8357  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb
      1014  /usr/lib/ruby/2.3.0/rubygems.rb
       160  (irb)

allocated memory by location
-----------------------------------
    314487  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:329
     98537  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:503
     80726  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:518
     73797  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:498
     69368  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:66
     61775  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:352
     32176  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:493
     29696  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:191
     25314  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:517
     21920  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:528
     19721  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:536
     13392  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:506
     11960  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:505
     11960  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:62
     11920  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:65
     10818  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:544
     10480  /home/anmol/Documents/work/css_parser/lib/css_parser.rb:164
      9224  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:168
      6848  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:365
      5507  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:366
      5120  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:189
      5120  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:18
      5120  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:20
      2096  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:107
      1787  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:61
      1384  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:136
      1089  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:873
      1064  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:44
      1014  /usr/lib/ruby/2.3.0/rubygems.rb:960
       777  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:321
       576  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1323
       464  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:118
       384  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:796
       320  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:581
       320  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1814
       320  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2428
       249  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:125
       249  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:127
       232  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:38
       232  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:41
       232  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:440
       214  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2304
       209  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:130
       169  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:371
       169  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:393
       169  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:500
       169  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:60
       169  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:120
       169  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:130
       169  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2435

allocated memory by class
-----------------------------------
    430640  MatchData
    336815  String
    139536  Hash
     34320  Array
      9224  CssParser::RuleSet
       240  File
       224  RubyVM::Env
       184  Addressable::URI
       160  Proc
       120  CssParser::Parser

allocated objects by gem
-----------------------------------
      8773  css_parser/lib
        87  addressable-2.5.2
         6  rubygems
         2  other

allocated objects by file
-----------------------------------
      4282  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb
      4229  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb
       262  /home/anmol/Documents/work/css_parser/lib/css_parser.rb
        87  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb
         6  /usr/lib/ruby/2.3.0/rubygems.rb
         2  (irb)

allocated objects by location
-----------------------------------
      3164  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:329
       685  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:498
       599  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:503
       535  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:517
       519  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:518
       422  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:352
       299  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:505
       299  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:506
       299  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:62
       299  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:66
       298  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:65
       262  /home/anmol/Documents/work/css_parser/lib/css_parser.rb:164
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:168
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:189
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:191
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:365
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:366
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:18
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:20
       128  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:493
        20  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:107
        11  /home/anmol/Documents/work/css_parser/lib/css_parser/rule_set.rb:61
         9  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:528
         8  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1814
         8  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2428
         6  /usr/lib/ruby/2.3.0/rubygems.rb:960
         6  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:873
         5  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:536
         5  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:544
         4  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1323
         4  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:136
         4  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2422
         4  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:796
         3  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:119
         3  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:120
         3  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:581
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:125
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:127
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1529
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2304
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2305
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:2306
         3  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:877
         2  (irb):5
         2  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:118
         2  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:130
         2  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:310
         2  /home/anmol/Documents/work/css_parser/lib/css_parser/parser.rb:450
         2  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:1187
         2  /var/lib/gems/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb:95

allocated objects by class
-----------------------------------
      5833  String
      1538  MatchData
       696  Hash
       665  Array
       128  CssParser::RuleSet
         2  Addressable::URI
         2  Proc
         2  RubyVM::Env
         1  CssParser::Parser
         1  File
chopraanmol1 commented 6 years ago

Benchmark Script Benchmark.realtime { 100.times{ CssParser::Parser.new.load_uri!("file:///home/*****/Documents/screen.css") } }

Previous 1.083729805002804

Current 0.5641982720007945

chopraanmol1 commented 5 years ago

@ndbroadbent can you look into this?

It's been quite a while from when I opened this PR.

ndbroadbent commented 5 years ago

@chopraanmol1 Sure this looks good to me, will merge it in. Might ping you if we see any issues related to this change