Filename | /home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm |
Statements | Executed 470694 statements in 23.8s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
271552 | 5 | 1 | 7.20s | 7.20s | CORE:subst (opcode) | OCBNET::CSS::Parser::CSS::
9988 | 2 | 1 | 7.02s | 15.5s | __ANON__[:252] (recurses: max depth 3, inclusive time 13.4s) | OCBNET::CSS::Parser::CSS::
20284 | 3 | 1 | 4.02s | 8.82s | __ANON__[:82] | OCBNET::CSS::Parser::CSS::
4752 | 1 | 1 | 3.27s | 4.48s | __ANON__[:154] | OCBNET::CSS::Parser::CSS::
139257 | 4 | 1 | 1.57s | 1.57s | CORE:regcomp (opcode) | OCBNET::CSS::Parser::CSS::
5036 | 2 | 2 | 516ms | 15.5s | __ANON__[:175] (recurses: max depth 2, inclusive time 12.3s) | OCBNET::CSS::Parser::CSS::
20284 | 1 | 1 | 347ms | 347ms | CORE:match (opcode) | OCBNET::CSS::Parser::CSS::
5020 | 4 | 1 | 106ms | 106ms | CORE:qr (opcode) | OCBNET::CSS::Parser::CSS::
1 | 1 | 1 | 3.09ms | 8.08ms | BEGIN@30 | OCBNET::CSS::Parser::CSS::
1 | 1 | 1 | 105µs | 208µs | BEGIN@10 | OCBNET::CSS::Parser::CSS::
1 | 1 | 1 | 57µs | 90µs | BEGIN@11 | OCBNET::CSS::Parser::CSS::
1 | 1 | 1 | 52µs | 52µs | BEGIN@19.7 | OCBNET::CSS::Parser::CSS::
1 | 1 | 1 | 52µs | 584µs | BEGIN@29 | OCBNET::CSS::Parser::CSS::
1 | 1 | 1 | 25µs | 25µs | BEGIN@22 | OCBNET::CSS::Parser::CSS::
1 | 1 | 1 | 25µs | 25µs | BEGIN@25 | OCBNET::CSS::Parser::CSS::
1 | 1 | 1 | 23µs | 23µs | BEGIN@16 | OCBNET::CSS::Parser::CSS::
1 | 1 | 1 | 22µs | 22µs | BEGIN@19 | OCBNET::CSS::Parser::CSS::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | ################################################################################################### | ||||
2 | # Copyright 2013 by Marcel Greter | ||||
3 | # This file is part of Webmerge (GPL3) | ||||
4 | #################################################################################################### | ||||
5 | # TODO: improve and test handling with invalid formated files | ||||
6 | #################################################################################################### | ||||
7 | package OCBNET::CSS::Parser::CSS; | ||||
8 | #################################################################################################### | ||||
9 | |||||
10 | 2 | 182µs | 2 | 311µs | # spent 208µs (105+103) within OCBNET::CSS::Parser::CSS::BEGIN@10 which was called:
# once (105µs+103µs) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 10 # spent 208µs making 1 call to OCBNET::CSS::Parser::CSS::BEGIN@10
# spent 103µs making 1 call to strict::import |
11 | 2 | 216µs | 2 | 124µs | # spent 90µs (57+34) within OCBNET::CSS::Parser::CSS::BEGIN@11 which was called:
# once (57µs+34µs) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 11 # spent 90µs making 1 call to OCBNET::CSS::Parser::CSS::BEGIN@11
# spent 34µs making 1 call to warnings::import |
12 | |||||
13 | #################################################################################################### | ||||
14 | |||||
15 | # define our version string | ||||
16 | 1 | 144µs | 1 | 23µs | # spent 23µs within OCBNET::CSS::Parser::CSS::BEGIN@16 which was called:
# once (23µs+0s) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 16 # spent 23µs making 1 call to OCBNET::CSS::Parser::CSS::BEGIN@16 |
17 | |||||
18 | # load exporter and inherit from it | ||||
19 | 3 | 359µs | 2 | 74µs | BEGIN { use Exporter qw(); our @ISA = qw(Exporter); } # spent 52µs making 1 call to OCBNET::CSS::Parser::CSS::BEGIN@19.7
# spent 22µs making 1 call to OCBNET::CSS::Parser::CSS::BEGIN@19 |
20 | |||||
21 | # define our functions that will be exported | ||||
22 | 1 | 170µs | 1 | 25µs | # spent 25µs within OCBNET::CSS::Parser::CSS::BEGIN@22 which was called:
# once (25µs+0s) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 22 # spent 25µs making 1 call to OCBNET::CSS::Parser::CSS::BEGIN@22 |
23 | |||||
24 | # define our functions than can be exported | ||||
25 | 1 | 143µs | 1 | 25µs | # spent 25µs within OCBNET::CSS::Parser::CSS::BEGIN@25 which was called:
# once (25µs+0s) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 25 # spent 25µs making 1 call to OCBNET::CSS::Parser::CSS::BEGIN@25 |
26 | |||||
27 | #################################################################################################### | ||||
28 | |||||
29 | 2 | 182µs | 2 | 1.12ms | # spent 584µs (52+533) within OCBNET::CSS::Parser::CSS::BEGIN@29 which was called:
# once (52µs+533µs) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 29 # spent 584µs making 1 call to OCBNET::CSS::Parser::CSS::BEGIN@29
# spent 533µs making 1 call to Exporter::import |
30 | 2 | 4.75ms | 2 | 8.71ms | # spent 8.08ms (3.09+5.00) within OCBNET::CSS::Parser::CSS::BEGIN@30 which was called:
# once (3.09ms+5.00ms) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 30 # spent 8.08ms making 1 call to OCBNET::CSS::Parser::CSS::BEGIN@30
# spent 628µs making 1 call to Exporter::import |
31 | |||||
32 | #################################################################################################### | ||||
33 | |||||
34 | 1 | 700ns | our $parse_blocks; | ||
35 | 1 | 400ns | our $parse_bracket; | ||
36 | 1 | 500ns | our $parse_definition; | ||
37 | 1 | 400ns | our $parse_declarations; | ||
38 | |||||
39 | #################################################################################################### | ||||
40 | |||||
41 | 1 | 65µs | 1 | 18µs | our $re_option = qr/\w(?:\w|-)*\s*:\s*[^;]+;/; # spent 18µs making 1 call to OCBNET::CSS::Parser::CSS::CORE:qr |
42 | 1 | 139µs | 2 | 91µs | our $re_options = qr/$re_option(?:\s*$re_option)*/m; # spent 81µs making 1 call to OCBNET::CSS::Parser::CSS::CORE:regcomp
# spent 10µs making 1 call to OCBNET::CSS::Parser::CSS::CORE:qr |
43 | |||||
44 | #################################################################################################### | ||||
45 | |||||
46 | 1 | 128µs | 6 | 51µs | my $re_closer = # spent 51µs making 6 calls to OCBNET::CSS::Parser::CSS::CORE:qr, avg 9µs/call |
47 | { | ||||
48 | "" => qr/\A\z/, | ||||
49 | "\(" => qr/\A(\)|\z)/, | ||||
50 | "\[" => qr/\A(\]|\z)/, | ||||
51 | "\{" => qr/\A(\}|\z)/, | ||||
52 | "\"" => qr/\A(\"|\z)/, | ||||
53 | "\'" => qr/\A(\'|\z)/ | ||||
54 | }; | ||||
55 | |||||
56 | #################################################################################################### | ||||
57 | |||||
58 | # rename either one of parse_decl subs | ||||
59 | $parse_definition = sub | ||||
60 | # spent 8.82s (4.02+4.81) within OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:82] which was called 20284 times, avg 435µs/call:
# 10036 times (2.38s+3.92s) by OCBNET::Spritesets::CSS::Parser::read at line 182 of webmerge/scripts/modules/OCBNET/Spritesets/CSS/Parser.pm, avg 628µs/call
# 5296 times (780ms+427ms) by OCBNET::Spritesets::CSS::Parser::read at line 138 of webmerge/scripts/modules/OCBNET/Spritesets/CSS/Parser.pm, avg 228µs/call
# 4952 times (857ms+457ms) by OCBNET::Spritesets::CSS::Parser::read at line 179 of webmerge/scripts/modules/OCBNET/Spritesets/CSS/Parser.pm, avg 265µs/call | ||||
61 | |||||
62 | 20284 | 115ms | my ($option, $code) = @_; | ||
63 | |||||
64 | # remove whitespace from body | ||||
65 | 20284 | 1.45s | 20284 | 1.09s | $code =~ s/(?:\A\s+|\s+\z)//gm; # spent 1.09s making 20284 calls to OCBNET::CSS::Parser::CSS::CORE:subst, avg 54µs/call |
66 | |||||
67 | # check if this is a valid sprite option block | ||||
68 | 20284 | 1.44s | 40568 | 445ms | return unless $code =~ m/^\s*$re_options(?:\s|\n)*\z/m; # spent 347ms making 20284 calls to OCBNET::CSS::Parser::CSS::CORE:match, avg 17µs/call
# spent 98.2ms making 20284 calls to OCBNET::CSS::Parser::CSS::CORE:regcomp, avg 5µs/call |
69 | |||||
70 | # split all declarations | ||||
71 | 34672 | 503ms | my @declarations = map { | ||
72 | 14908 | 693ms | [ split(/\s*:\s*/, $_, 2) ] | ||
73 | } split(/\s*;\s*/, $code); | ||||
74 | |||||
75 | # set option via our css system | ||||
76 | 14908 | 69.0ms | foreach my $item (@declarations) | ||
77 | 34672 | 587ms | 34672 | 3.27s | { $option->set(lc $item->[0], $item->[1]); } # spent 3.27s making 34672 calls to OCBNET::Spritesets::CSS::Collection::set, avg 94µs/call |
78 | |||||
79 | # return object | ||||
80 | 14908 | 495ms | return $option; | ||
81 | |||||
82 | 1 | 16µs | }; | ||
83 | |||||
84 | # parse all declaration in given data | ||||
85 | # usefull to parse css selector blocks | ||||
86 | # also used to parse spriteset comments | ||||
87 | # ****************************************************************************** | ||||
88 | $parse_declarations = sub | ||||
89 | # spent 4.48s (3.27+1.20) within OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:154] which was called 4752 times, avg 942µs/call:
# 4752 times (3.27s+1.20s) by OCBNET::Spritesets::CSS::Block::parse at line 43 of webmerge/scripts/modules/OCBNET/Spritesets/CSS/Block.pm, avg 942µs/call | ||||
90 | |||||
91 | # get stylesheet | ||||
92 | 4752 | 17.2ms | my ($data) = @_; | ||
93 | |||||
94 | # array of rules | ||||
95 | 4752 | 6.70ms | my @declarations; | ||
96 | |||||
97 | # loop until no more data | ||||
98 | 4752 | 18.8ms | while (${$data} ne '') | ||
99 | { | ||||
100 | # consume data | ||||
101 | 28240 | 2.30s | 56480 | 982ms | if (${$data} =~ # spent 786ms making 28240 calls to OCBNET::CSS::Parser::CSS::CORE:subst, avg 28µs/call
# spent 196ms making 28240 calls to OCBNET::CSS::Parser::CSS::CORE:regcomp, avg 7µs/call |
102 | s/^ | ||||
103 | ( | ||||
104 | (?: | ||||
105 | # escaped char | ||||
106 | (?: \\ .)+ | | ||||
107 | # comment or only a slash | ||||
108 | \/+ (?:\*+ .*? \*+ \/+)? | | ||||
109 | # a string in delimiters | ||||
110 | \" $re_quot \" | \' $re_apo \' | | ||||
111 | # not the delimiter | ||||
112 | [^\:\;\/]+ | ||||
113 | )* | ||||
114 | ) | ||||
115 | ( | ||||
116 | (?:\: | ||||
117 | # escaped char | ||||
118 | (?: \\ .)+ | | ||||
119 | # comment or only a slash | ||||
120 | \/+ (?:\*+ .*? \*+ \/+)? | | ||||
121 | # a string in delimiters | ||||
122 | \" $re_quot \" | \' $re_apo \' | | ||||
123 | # not the delimiter | ||||
124 | [^\;\/]+ | ||||
125 | )* | ||||
126 | (?:\;|\z) | ||||
127 | ) | ||||
128 | //xs | ||||
129 | ) | ||||
130 | { | ||||
131 | |||||
132 | # store the name and the config | ||||
133 | # create a copy for stripped version | ||||
134 | 28240 | 470ms | my $declaration = [$1, $2, $1, $2]; | ||
135 | |||||
136 | # strip comments from declaration copy | ||||
137 | 28240 | 816ms | 28240 | 162ms | $declaration->[2] =~ s/\/\*\s*.*?\s*\*\///gs; # spent 162ms making 28240 calls to OCBNET::CSS::Parser::CSS::CORE:subst, avg 6µs/call |
138 | 28240 | 618ms | 28240 | 57.4ms | $declaration->[3] =~ s/\/\*\s*.*?\s*\*\///gs; # spent 57.4ms making 28240 calls to OCBNET::CSS::Parser::CSS::CORE:subst, avg 2µs/call |
139 | |||||
140 | # store in order into array | ||||
141 | 28240 | 159ms | push @declarations, $declaration; | ||
142 | |||||
143 | } | ||||
144 | else | ||||
145 | { | ||||
146 | # this should not happen, investigate further | ||||
147 | die "Fatal: CSS parse error: ", substr(${$data}, 0, 110); | ||||
148 | } | ||||
149 | } | ||||
150 | |||||
151 | # return parsed declarations | ||||
152 | 4752 | 205ms | return \ @declarations; | ||
153 | |||||
154 | 1 | 11µs | }; | ||
155 | # EO sub $parse_declarations | ||||
156 | |||||
157 | #################################################################################################### | ||||
158 | |||||
159 | # parse the css into blocks | ||||
160 | $parse_blocks = sub | ||||
161 | # spent 15.5s (516ms+15.0) within OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:175] which was called 5036 times, avg 3.08ms/call:
# 5012 times (514ms+-514ms) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:252] at line 221, avg 0s/call
# 24 times (1.75ms+15.5s) by OCBNET::Spritesets::CSS::Parser::read at line 95 of webmerge/scripts/modules/OCBNET/Spritesets/CSS/Parser.pm, avg 646ms/call | ||||
162 | |||||
163 | # get passed input arguments | ||||
164 | 5036 | 28.2ms | my ($data, $parent, $clause) = @_; | ||
165 | |||||
166 | # create new block node with the given parent | ||||
167 | 5036 | 131ms | 5036 | 700ms | my $block = OCBNET::Spritesets::CSS::Block->new($parent); # spent 700ms making 5036 calls to OCBNET::Spritesets::CSS::Block::new, avg 139µs/call |
168 | |||||
169 | # parse the new block as normal bracket block | ||||
170 | 5036 | 65.7ms | 5036 | 15.5s | $parse_bracket->($data, $block, '', $clause); # spent 26.6s making 5036 calls to OCBNET::CSS::Parser::CSS::__ANON__[webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:252], avg 5.28ms/call, recursion: max depth 2, sum of overlapping time 11.1s |
171 | |||||
172 | # return object | ||||
173 | 5036 | 172ms | return $parent; | ||
174 | |||||
175 | 1 | 9µs | }; | ||
176 | |||||
177 | #################################################################################################### | ||||
178 | |||||
179 | # parse a bracket block | ||||
180 | $parse_bracket = sub | ||||
181 | # spent 15.5s (7.02+8.47) within OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:252] which was called 9988 times, avg 1.55ms/call:
# 5036 times (6.02s+9.47s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:175] at line 170, avg 3.08ms/call
# 4952 times (995ms+-995ms) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:252] at line 230, avg 0s/call | ||||
182 | |||||
183 | # get passed input arguments | ||||
184 | 9988 | 69.7ms | my ($data, $block, $opener, $clause) = @_; | ||
185 | |||||
186 | # add opener to head if defined | ||||
187 | 9988 | 40.1ms | $block->{'head'} .= $opener if $opener; | ||
188 | |||||
189 | # repeat until all the data is parsed | ||||
190 | # be sure to include an abort clause | ||||
191 | 9988 | 14.9ms | while(1) | ||
192 | { | ||||
193 | |||||
194 | # simpler grammars | ||||
195 | 50480 | 12.2s | 257280 | 6.38s | if (${$data} =~ s/^( # spent 5.10s making 166548 calls to OCBNET::CSS::Parser::CSS::CORE:subst, avg 31µs/call
# spent 1.28s making 90732 calls to OCBNET::CSS::Parser::CSS::CORE:regcomp, avg 14µs/call |
196 | # escaped char | ||||
197 | (?: \\ .)+ | | ||||
198 | # comment or only a slash | ||||
199 | \/+ (?:\* .*? \*\/+)? | | ||||
200 | # a string in delimiters | ||||
201 | \" $re_quot \" | \' $re_apo \' | ||||
202 | )//xs) | ||||
203 | { | ||||
204 | # just store the match | ||||
205 | $block->{'head'} .= $1; | ||||
206 | } | ||||
207 | |||||
208 | # check if we found our exit clause | ||||
209 | elsif (${$data} =~ s/^($clause)//s) | ||||
210 | { | ||||
211 | # add closer to head if defined | ||||
212 | 9988 | 71.8ms | $block->{'head'} .= $1 if $opener; | ||
213 | # return the block node | ||||
214 | 9988 | 366ms | return $block; | ||
215 | } | ||||
216 | |||||
217 | # parse an inner block recursive | ||||
218 | elsif (${$data} =~ s/^(\{)//s) | ||||
219 | { | ||||
220 | # parse this one block body | ||||
221 | 5012 | 352ms | 10024 | 106ms | $parse_blocks->($data, $block, qr/^(\})/); # spent 106ms making 5012 calls to OCBNET::CSS::Parser::CSS::CORE:qr, avg 21µs/call
# spent 12.3s making 5012 calls to OCBNET::CSS::Parser::CSS::__ANON__[webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:175], avg 2.45ms/call, recursion: max depth 2, sum of overlapping time 12.3s |
222 | # create new block node with the given parent | ||||
223 | 5012 | 202ms | 5012 | 773ms | $block = OCBNET::Spritesets::CSS::Block->new($block->{'parent'}); # spent 773ms making 5012 calls to OCBNET::Spritesets::CSS::Block::new, avg 154µs/call |
224 | } | ||||
225 | |||||
226 | # parse further for a bracket | ||||
227 | elsif (${$data} =~ s/^(\(|\[)//s) | ||||
228 | { | ||||
229 | # parse a default bracket block | ||||
230 | 4952 | 140ms | 4952 | 0s | $parse_bracket->($data, $block, $1, $re_closer->{$1}); # spent 2.32s making 4952 calls to OCBNET::CSS::Parser::CSS::__ANON__[webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:252], avg 468µs/call, recursion: max depth 3, sum of overlapping time 2.32s |
231 | } | ||||
232 | |||||
233 | # parse unimportant chars in this context | ||||
234 | elsif (${$data} =~ s/^([^\{\}\[\]\(\)\"\'\/]+)//s) | ||||
235 | { | ||||
236 | $block->{'head'} .= $1; | ||||
237 | } | ||||
238 | |||||
239 | # invalid parsing | ||||
240 | else | ||||
241 | { | ||||
242 | # this should not happen, investigate further | ||||
243 | die "Fatal: CSS parse error: ", substr(${$data}, 0, 10); | ||||
244 | } | ||||
245 | |||||
246 | } | ||||
247 | # EO while 1 | ||||
248 | |||||
249 | # this should not happen, investigate further | ||||
250 | die "Fatal: Escaped endless parse loop?"; | ||||
251 | |||||
252 | 1 | 11µs | }; | ||
253 | |||||
254 | #################################################################################################### | ||||
255 | #################################################################################################### | ||||
256 | 1 | 36µs | 1; | ||
# spent 347ms within OCBNET::CSS::Parser::CSS::CORE:match which was called 20284 times, avg 17µs/call:
# 20284 times (347ms+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:82] at line 68, avg 17µs/call | |||||
# spent 106ms within OCBNET::CSS::Parser::CSS::CORE:qr which was called 5020 times, avg 21µs/call:
# 5012 times (106ms+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:252] at line 221, avg 21µs/call
# 6 times (51µs+0s) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 46, avg 9µs/call
# once (18µs+0s) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 41
# once (10µs+0s) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 42 | |||||
# spent 1.57s within OCBNET::CSS::Parser::CSS::CORE:regcomp which was called 139257 times, avg 11µs/call:
# 90732 times (1.28s+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:252] at line 195, avg 14µs/call
# 28240 times (196ms+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:154] at line 101, avg 7µs/call
# 20284 times (98.2ms+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:82] at line 68, avg 5µs/call
# once (81µs+0s) by OCBNET::Spritesets::CSS::Block::BEGIN@23 at line 42 | |||||
# spent 7.20s within OCBNET::CSS::Parser::CSS::CORE:subst which was called 271552 times, avg 27µs/call:
# 166548 times (5.10s+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:252] at line 195, avg 31µs/call
# 28240 times (786ms+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:154] at line 101, avg 28µs/call
# 28240 times (162ms+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:154] at line 137, avg 6µs/call
# 28240 times (57.4ms+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:154] at line 138, avg 2µs/call
# 20284 times (1.09s+0s) by OCBNET::CSS::Parser::CSS::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:82] at line 65, avg 54µs/call |