WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
46066
SVG: Make SVGLength's stringToLengthType() stricter and faster
https://bugs.webkit.org/show_bug.cgi?id=46066
Summary
SVG: Make SVGLength's stringToLengthType() stricter and faster
Andreas Kling
Reported
2010-09-19 17:39:03 PDT
stringToLengthType() in SVGLength.cpp is currently testing String::endsWith("foo") which causes temporary WTF::Strings to be created. We can easily hand-compare the characters to speed up this function.
Attachments
Proposed patch
(2.36 KB, patch)
2010-09-19 17:43 PDT
,
Andreas Kling
krit
: review-
Details
Formatted Diff
Diff
Proposed patch v2
(8.06 KB, patch)
2010-09-24 12:46 PDT
,
Andreas Kling
krit
: review-
Details
Formatted Diff
Diff
Proposed patch v3
(7.95 KB, patch)
2010-09-24 15:01 PDT
,
Andreas Kling
no flags
Details
Formatted Diff
Diff
Show Obsolete
(2)
View All
Add attachment
proposed patch, testcase, etc.
Andreas Kling
Comment 1
2010-09-19 17:43:47 PDT
Created
attachment 68042
[details]
Proposed patch This patch yields a 10.5% speedup on
http://data.xeoh.net/svg.benchmark/
Antonio Gomes
Comment 2
2010-09-19 18:02:52 PDT
(In reply to
comment #1
)
> Created an attachment (id=68042) [details] > Proposed patch > > This patch yields a 10.5% speedup on
http://data.xeoh.net/svg.benchmark/
L_Great_TM :)
Dirk Schulze
Comment 3
2010-09-19 23:55:12 PDT
Comment on
attachment 68042
[details]
Proposed patch View in context:
https://bugs.webkit.org/attachment.cgi?id=68042&action=prettypatch
> WebCore/svg/SVGLength.cpp:97 > + if (characters[length - 1] == '%')
Can you put UChar b = characters[length - 1]; right before this check? The names should indicate the content. Can you use 'lastChar' for b or simply 'end'? a also needs a better name. Just a bit strange that we give back number, if the string doesn't end with a length type that we know.
> WebCore/svg/SVGLength.cpp:104 > + UChar a = characters[length - 2]; > + UChar b = characters[length - 1];
Should be const. I was looking at setValueAsString, the caller of this function. And it looks bogus to me, to just check the last or last two chars. Following example would parse on WebKit, while it doesn't on other Viewers: <rect width="20 mm" height="20*SomethinStupid*px"/> Can't you just use 'ptr' and 'end' of setValueAsString? 'ptr' is the first char after the parsed number of the string. We don't need String at all on lengthTypeToString. This change will need new layouttests.
Andreas Kling
Comment 4
2010-09-24 12:46:29 PDT
Created
attachment 68733
[details]
Proposed patch v2 Strictified SVGLength to only accept unit types immediately following the numeric value, and with no whitespace after. This behavior matches Firefox, but not IE9 or Opera. IE9 accepts whitespace on both sides of the unit type. Opera doesn't accept whitespace between the numeric value and the unit type, but accepts it after the unit type.
Dirk Schulze
Comment 5
2010-09-24 14:24:36 PDT
Comment on
attachment 68733
[details]
Proposed patch v2 View in context:
https://bugs.webkit.org/attachment.cgi?id=68733&action=review
The code is not realy faster with the mentioned changes, but looks more like the rest of the parsing code in SVGParserUttilities.cpp. And it may make it easier to change the code to ignore whitespaces at the end without parsing error later (the default behavior on Opera, but not specified yet) by just adding two more lines. The test looks great! Great patch!
> WebCore/svg/SVGLength.cpp:89 > +inline SVGLengthType stringToLengthType(const UChar* characters, const UChar* end)
const UChar*& ptr
> WebCore/svg/SVGLength.cpp:94 > + unsigned length = end - characters; > + > + if (!length) > + return LengthTypeNumber;
if (ptr == end) return LengthTypeNumber;
> WebCore/svg/SVGLength.cpp:105 > + if (length != 1 && length != 2) > + return LengthTypeUnknown; > + > + const UChar lastChar = characters[length - 1]; > + > + if (length == 1) { > + if (lastChar == '%') > + return LengthTypePercentage; > + return LengthTypeUnknown; > + }
const UChar firstChar = *ptr; ++ptr; if (firstChar == '%') { if (ptr == end) return LengthTypePercentage; return LengthTypeUnkown; } const UChar secondChar = *ptr; if (++ptr != end) return LengthTypeUnkown;
Andreas Kling
Comment 6
2010-09-24 15:01:23 PDT
Created
attachment 68761
[details]
Proposed patch v3 Updated with Dirk's suggestions.
Dirk Schulze
Comment 7
2010-09-24 15:10:21 PDT
Comment on
attachment 68761
[details]
Proposed patch v3 LGTM. r=me.
WebKit Commit Bot
Comment 8
2010-09-24 15:57:33 PDT
Comment on
attachment 68761
[details]
Proposed patch v3 Clearing flags on attachment: 68761 Committed
r68307
: <
http://trac.webkit.org/changeset/68307
>
WebKit Commit Bot
Comment 9
2010-09-24 15:57:39 PDT
All reviewed patches have been landed. Closing bug.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug