RESOLVED CONFIGURATION CHANGED Bug 66851
Fix CSSPrimitiveValue::cssText() to use StringBuilder
https://bugs.webkit.org/show_bug.cgi?id=66851
Summary Fix CSSPrimitiveValue::cssText() to use StringBuilder
Oliver Varga
Reported 2011-08-24 05:09:34 PDT
Replace the string concatenation (+, +=, and Vector<Uchar> append()) to the much faster StringBuilder append(). http://www.mail-archive.com/webkit-dev@lists.webkit.org/msg16022.html
Attachments
Fix CSSPrimitiveValue::cssText() to use StringBuilder (14.34 KB, patch)
2011-08-24 05:15 PDT, Oliver Varga
no flags
Fix CSSPrimitiveValue::cssText() to use StringBuilder (12.99 KB, patch)
2011-08-25 00:35 PDT, Oliver Varga
no flags
Fix CSSPrimitiveValue::cssText() to use StringBuilder (12.88 KB, patch)
2011-08-25 01:35 PDT, Oliver Varga
darin: review-
darin: commit-queue-
Fix CSSPrimitiveValue::cssText() to use StringBuilder (12.93 KB, patch)
2011-08-26 02:42 PDT, Oliver Varga
no flags
Fix CSSPrimitiveValue::cssText() to use StringBuilder (18.00 KB, patch)
2011-09-14 10:08 PDT, Oliver Varga
no flags
Fix CSSPrimitiveValue::cssText() to use StringBuilder (17.90 KB, patch)
2011-09-14 10:22 PDT, Oliver Varga
webkit.review.bot: commit-queue-
Fix CSSPrimitiveValue::cssText() to use StringBuilder (22.54 KB, patch)
2011-10-14 09:28 PDT, Oliver Varga
webkit.review.bot: commit-queue-
Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload (21.94 KB, patch)
2011-10-17 06:37 PDT, Oliver Varga
no flags
Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload (21.31 KB, patch)
2011-10-18 07:11 PDT, Oliver Varga
no flags
Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload (21.35 KB, patch)
2011-10-19 00:40 PDT, Oliver Varga
no flags
Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload (21.35 KB, patch)
2011-10-19 00:42 PDT, Oliver Varga
no flags
Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload (21.35 KB, patch)
2011-10-21 05:32 PDT, Oliver Varga
no flags
Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload (21.26 KB, patch)
2011-10-21 08:29 PDT, Oliver Varga
kling: review-
Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload (20.87 KB, patch)
2011-10-23 14:19 PDT, Oliver Varga
tkent: review-
darin: commit-queue-
Correcting (22.59 KB, patch)
2011-11-03 06:20 PDT, Oliver Varga
darin: review-
darin: commit-queue-
Correcting v2 (29.06 KB, patch)
2012-01-09 07:00 PST, Szilard Ledan
tonikitoo: review-
webkit.review.bot: commit-queue-
Oliver Varga
Comment 1 2011-08-24 05:15:14 PDT
Created attachment 104982 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder
Andreas Kling
Comment 2 2011-08-24 06:03:23 PDT
Comment on attachment 104982 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder View in context: https://bugs.webkit.org/attachment.cgi?id=104982&action=review > Source/WebCore/ChangeLog:14 > + According to the tests youtube, ebay, > + baidu and wordpress loading is faster about 5-8%. 5-8%? Seriously? That sounds way too good to be true, how are you testing this exactly?
Darin Adler
Comment 3 2011-08-24 09:50:27 PDT
Comment on attachment 104982 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder View in context: https://bugs.webkit.org/attachment.cgi?id=104982&action=review Thanks for tackling this. I see no reason to overload the += operator, though. Lets use append. > Source/JavaScriptCore/wtf/text/StringBuilder.h:57 > + inline void operator+=(const String& string) Why is it critical to use += instead of an append function? Just to keep the editing down? > Source/WebCore/css/CSSPrimitiveValue.cpp:646 > + text += formatNumber(m_value.num); > + text += "em"; I think these would read better as append function calls.
Zoltan Herczeg
Comment 4 2011-08-24 23:33:31 PDT
I suggested Oliver to keep the += since for me it is easier to read. Sorry Oliver for the extra work.
Oliver Varga
Comment 5 2011-08-24 23:35:06 PDT
(In reply to comment #2) > (From update of attachment 104982 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=104982&action=review > > > Source/WebCore/ChangeLog:14 > > + According to the tests youtube, ebay, > > + baidu and wordpress loading is faster about 5-8%. > > 5-8%? Seriously? That sounds way too good to be true, how are you testing this exactly? I tested our internal testing system, called "methanol benchmarking". It is loading webpages many times and it is measured.
Oliver Varga
Comment 6 2011-08-25 00:35:26 PDT
Created attachment 105141 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder
Oliver Varga
Comment 7 2011-08-25 01:23:25 PDT
(In reply to comment #2) > (From update of attachment 104982 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=104982&action=review > > > Source/WebCore/ChangeLog:14 > > + According to the tests youtube, ebay, > > + baidu and wordpress loading is faster about 5-8%. > > 5-8%? Seriously? That sounds way too good to be true, how are you testing this exactly? You are right, the 5-8% is too good to be true. I performed the tests again, and now generated a minimal performance tweak.
Oliver Varga
Comment 8 2011-08-25 01:35:12 PDT
Created attachment 105144 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder
Darin Adler
Comment 9 2011-08-25 07:40:02 PDT
Comment on attachment 105144 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder View in context: https://bugs.webkit.org/attachment.cgi?id=105144&action=review My comments include many ideas that are ways to do better in the future. The one thing you should definitely fix before landing is the append(c) thing. Please consider the others too, though. We don’t want any changes that actually make things slower. > Source/WebCore/css/CSSPrimitiveValue.cpp:638 > + text.append(formatNumber(m_value.num)); Suggestion for further improvement: There’s a significant performance gain available if we can come up with a way to do these without creating a string and then appending it. We need an equivalent of formatNumber that works directly with the StringBuilder, or some way that does not involve memory allocation other than what StringBuilder does. > Source/WebCore/css/CSSPrimitiveValue.cpp:716 > - text = quoteCSSStringIfNeeded(m_value.string); > + text.append(quoteCSSStringIfNeeded(m_value.string)); Similarly, for the quoted string case it's much more efficient to do the quoting without allocating an entire new string. > Source/WebCore/css/CSSPrimitiveValue.cpp:732 > DEFINE_STATIC_LOCAL(const String, attrParen, ("attr(")); There's no value in having this pre-allocated in a String. It can just be an append of a const char*. > Source/WebCore/css/CSSPrimitiveValue.cpp:755 > DEFINE_STATIC_LOCAL(const String, rectParen, ("rect(")); There's no value in having this pre-allocated in a String. It can just be an append of a const char*. > Source/WebCore/css/CSSPrimitiveValue.cpp:-737 > - Vector<UChar> result; > - result.reserveInitialCapacity(32); Are you sure the StringBuilder is more efficient than the Vector<UChar> was? > Source/WebCore/css/CSSPrimitiveValue.cpp:762 > + result.append(rectVal->top()->cssText()); This is another opportunity to be much more efficient. If we had a function that appended the CSS text to a StringBuilder without ever creating a string, we could probably save many extra string allocations here. > Source/WebCore/css/CSSPrimitiveValue.cpp:794 > - appendNumber(result, static_cast<unsigned char>(color.red())); > - append(result, commaSpace); > + result.append(String::number(color.red())); Again, making a string out of the number just to put it in the string builder is quite inefficient. It’s a step backwards to go from the appendNumber function, which can and has been optimized, to an implementation that explicitly allocates a string each time. > Source/WebCore/css/CSSPrimitiveValue.cpp:853 > char c = static_cast<char>(m_value.ident); > - text = String(&c, 1U); > + text.append(String(&c, 1U)); This is wrong. It can just be append(c) or even append(static_cast<char>(m_value.ident)). Explicitly creating a string makes us dow double allocation. > Source/WebCore/css/CSSPrimitiveValue.cpp:867 > - cssTextCache().set(this, text); > + cssTextCache().set(this, text.toString()); > m_hasCachedCSSText = true; > - return text; > + return text.toString(); Calling toString() twice seems a bit inelegant. I would put the string into a local variable instead.
Oliver Varga
Comment 10 2011-08-26 02:41:48 PDT
(In reply to comment #9) > (From update of attachment 105144 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=105144&action=review > > My comments include many ideas that are ways to do better in the future. The one thing you should definitely fix before landing is the append(c) thing. Please consider the others too, though. We don’t want any changes that actually make things slower. > > > Source/WebCore/css/CSSPrimitiveValue.cpp:638 > > + text.append(formatNumber(m_value.num)); > > Suggestion for further improvement: > > There’s a significant performance gain available if we can come up with a way to do these without creating a string and then appending it. We need an equivalent of formatNumber that works directly with the StringBuilder, or some way that does not involve memory allocation other than what StringBuilder does. > > > Source/WebCore/css/CSSPrimitiveValue.cpp:716 > > - text = quoteCSSStringIfNeeded(m_value.string); > > + text.append(quoteCSSStringIfNeeded(m_value.string)); > > Similarly, for the quoted string case it's much more efficient to do the quoting without allocating an entire new string. > > > Source/WebCore/css/CSSPrimitiveValue.cpp:732 > > DEFINE_STATIC_LOCAL(const String, attrParen, ("attr(")); > > There's no value in having this pre-allocated in a String. It can just be an append of a const char*. > > > Source/WebCore/css/CSSPrimitiveValue.cpp:755 > > DEFINE_STATIC_LOCAL(const String, rectParen, ("rect(")); > > There's no value in having this pre-allocated in a String. It can just be an append of a const char*. > > > Source/WebCore/css/CSSPrimitiveValue.cpp:-737 > > - Vector<UChar> result; > > - result.reserveInitialCapacity(32); > > Are you sure the StringBuilder is more efficient than the Vector<UChar> was? > > > Source/WebCore/css/CSSPrimitiveValue.cpp:762 > > + result.append(rectVal->top()->cssText()); > > This is another opportunity to be much more efficient. If we had a function that appended the CSS text to a StringBuilder without ever creating a string, we could probably save many extra string allocations here. > > > Source/WebCore/css/CSSPrimitiveValue.cpp:794 > > - appendNumber(result, static_cast<unsigned char>(color.red())); > > - append(result, commaSpace); > > + result.append(String::number(color.red())); > > Again, making a string out of the number just to put it in the string builder is quite inefficient. It’s a step backwards to go from the appendNumber function, which can and has been optimized, to an implementation that explicitly allocates a string each time. > > > Source/WebCore/css/CSSPrimitiveValue.cpp:853 > > char c = static_cast<char>(m_value.ident); > > - text = String(&c, 1U); > > + text.append(String(&c, 1U)); > > This is wrong. It can just be append(c) or even append(static_cast<char>(m_value.ident)). Explicitly creating a string makes us dow double allocation. > > > Source/WebCore/css/CSSPrimitiveValue.cpp:867 > > - cssTextCache().set(this, text); > > + cssTextCache().set(this, text.toString()); > > m_hasCachedCSSText = true; > > - return text; > > + return text.toString(); > > Calling toString() twice seems a bit inelegant. I would put the string into a local variable instead. Sorry for the inattention, now I'm correcting. And thank you for the guidance. I will considered your suggestions.
Oliver Varga
Comment 11 2011-08-26 02:42:30 PDT
Created attachment 105339 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder
Oliver Varga
Comment 12 2011-09-14 10:08:02 PDT
Created attachment 107345 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder
WebKit Review Bot
Comment 13 2011-09-14 10:10:15 PDT
Attachment 107345 [details] did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'Source/JavaScriptCore/ChangeLog', u'Source..." exit_code: 1 Source/WebCore/css/CSSPrimitiveValue.cpp:894: Should have a space between // and comment [whitespace/comments] [4] Source/JavaScriptCore/wtf/text/StringBuilder.h:31: Alphabetical sorting problem. [build/include_order] [4] Source/JavaScriptCore/wtf/text/StringBuilder.h:32: Alphabetical sorting problem. [build/include_order] [4] Source/JavaScriptCore/wtf/text/StringBuilder.h:108: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/wtf/text/StringBuilder.h:144: Place brace on its own line for function definitions. [whitespace/braces] [4] Source/JavaScriptCore/wtf/text/StringBuilder.h:150: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/wtf/text/StringBuilder.h:166: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Total errors found: 7 in 4 files If any of these errors are false positives, please file a bug against check-webkit-style.
Oliver Varga
Comment 14 2011-09-14 10:22:13 PDT
Created attachment 107347 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder
WebKit Review Bot
Comment 15 2011-09-14 20:04:06 PDT
Comment on attachment 107347 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder Attachment 107347 [details] did not pass chromium-ews (chromium-xvfb): Output: http://queues.webkit.org/results/9651887 New failing tests: editing/execCommand/query-command-value-background-color.html svg/animations/animate-color-rgba-calcMode-discrete.html
Darin Adler
Comment 16 2011-09-15 15:01:12 PDT
Comment on attachment 107347 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder View in context: https://bugs.webkit.org/attachment.cgi?id=107347&action=review > Source/JavaScriptCore/wtf/text/StringBuilder.h:105 > + char* number = new char[absoluteExp + sizeOfsignificand + 3]; This is an inefficient way to allocate memory, and the wrong way to go for this function. The point of such functions is to be fast and doing a malloc makes them slow. An efficient way to allocate memory is: Vector<char, 32> number(absoluteExp + sizeOfsignificand + 3); This will use the stack for the buffer unless the buffer has to be larger than 32 bytes. > Source/JavaScriptCore/wtf/text/StringBuilder.h:158 > + char* number = new char[digitsOfNumber + 1]; Ditto.
Oliver Varga
Comment 17 2011-10-14 09:28:01 PDT
Created attachment 111022 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder
WebKit Review Bot
Comment 18 2011-10-14 09:50:09 PDT
Comment on attachment 111022 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder Attachment 111022 [details] did not pass chromium-ews (chromium-xvfb): Output: http://queues.webkit.org/results/10054573
Darin Adler
Comment 19 2011-10-14 10:31:23 PDT
Comment on attachment 111022 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder View in context: https://bugs.webkit.org/attachment.cgi?id=111022&action=review > Source/JavaScriptCore/wtf/text/StringBuilder.h:135 > + void append(double d, int precision = 6) This giant function should not be inlined in a header.
Oliver Varga
Comment 20 2011-10-17 06:37:10 PDT
Created attachment 111257 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload
WebKit Review Bot
Comment 21 2011-10-17 06:40:16 PDT
Attachment 111257 [details] did not pass style-queue: Failed to run "['Tools/Scripts/update-webkit', '--chromium']" exit_code: 2 Updating OpenSource From git://git.webkit.org/WebKit 293b636..9b6f4d5 master -> origin/master M Tools/BuildSlaveSupport/build.webkit.org-config/config.json M Tools/ChangeLog r97614 = 9b6f4d5fe02791ab160cc89f3585e1ae198694bd (refs/remotes/trunk) First, rewinding head to replay your work on top of it... Fast-forwarded master to refs/remotes/trunk. Updating chromium port dependencies using gclient... Error: Can't switch the checkout to http://v8.googlecode.com/svn/branches/3.6@9637; UUID don't match and there is local changes in /mnt/git/webkit-style-queue/Source/WebKit/chromium/v8. Delete the directory and try again. Re-trying 'depot_tools/gclient sync' Error: Can't switch the checkout to http://v8.googlecode.com/svn/branches/3.6@9637; UUID don't match and there is local changes in /mnt/git/webkit-style-queue/Source/WebKit/chromium/v8. Delete the directory and try again. Re-trying 'depot_tools/gclient sync' Error: Can't switch the checkout to http://v8.googlecode.com/svn/branches/3.6@9637; UUID don't match and there is local changes in /mnt/git/webkit-style-queue/Source/WebKit/chromium/v8. Delete the directory and try again. Error: 'depot_tools/gclient sync' failed 3 tries and returned 256 at Tools/Scripts/update-webkit-chromium line 107. Re-trying 'depot_tools/gclient sync' No such file or directory at Tools/Scripts/update-webkit line 104. If any of these errors are false positives, please file a bug against check-webkit-style.
Oliver Varga
Comment 22 2011-10-18 07:11:58 PDT
Created attachment 111441 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload
Oliver Varga
Comment 23 2011-10-19 00:40:34 PDT
Created attachment 111570 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload
WebKit Review Bot
Comment 24 2011-10-19 00:42:12 PDT
Attachment 111570 [details] did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'Source/JavaScriptCore/ChangeLog', u'Source..." exit_code: 1 Source/JavaScriptCore/wtf/text/StringBuilder.h:31: Alphabetical sorting problem. [build/include_order] [4] Total errors found: 1 in 4 files If any of these errors are false positives, please file a bug against check-webkit-style.
Oliver Varga
Comment 25 2011-10-19 00:42:38 PDT
Created attachment 111571 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload
Oliver Varga
Comment 26 2011-10-21 05:32:05 PDT
Created attachment 111955 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload I correct the previous mistake I found here: http://queues.webkit.org/results/10121269 After that I didn't found any information in connection with the Build Failed on win EWS. I try to upload again the previous patch.
Darin Adler
Comment 27 2011-10-21 07:47:52 PDT
Comment on attachment 111955 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload View in context: https://bugs.webkit.org/attachment.cgi?id=111955&action=review If you want a patch to be reviewed, you need to set review+ on it. > Source/JavaScriptCore/wtf/text/StringBuilder.h:82 > + static inline unsigned getPrecision(int m_exponent, unsigned m_precision, unsigned digitsBeforeDecimalPoint) The inline keyword here is not needed. > Source/JavaScriptCore/wtf/text/StringBuilder.h:108 > + { > + // #shift > + int p = 1; > + while (num[p+1] != '\0' && p <= shift && num[1] != '\0') { > + num[ p ] = num[p+1]; > + num[p+1] = '.'; > + p++; > + } This function is indented 8 rather than 4 space tab stops. > Source/JavaScriptCore/wtf/text/StringBuilder.h:136 > + void append(double d) This large function should not be inlined in a header.
Oliver Varga
Comment 28 2011-10-21 08:29:29 PDT
Created attachment 111969 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload I corrected the indentation, and deleted the inline modifier.
Andreas Kling
Comment 29 2011-10-21 08:47:20 PDT
Comment on attachment 111969 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload You need to move the huge functions in StringBuilder.h to a cpp file to prevent them from being inlined at least once per compilation unit that calls them.
Oliver Varga
Comment 30 2011-10-23 14:19:55 PDT
Created attachment 112126 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload The huge functions moved to the StringBuilder.cpp
Kent Tamura
Comment 31 2011-10-23 21:41:36 PDT
Comment on attachment 112126 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload View in context: https://bugs.webkit.org/attachment.cgi?id=112126&action=review > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:180 > + length += -m_exponent - 1; > + length += m_precision; > + return length; 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:184 > + return 0; ditto. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:198 > + while (num[p+1] != '\0' && p <= shift && num[1] != '\0') { > + num[ p ] = num[p+1]; > + num[p+1] = '.'; > + p++; 5 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:206 > + while (p <= shift) { > + num[ p ] = '0'; > + num[p+1] = '.'; > + num[p+2] = 0; > + p++; ditto. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:212 > + for (int i = length - 1; i >= p && (num[i] == '0' || num[i] == '.'); --i) > + num[i]=0; 5 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:216 > + if (num[0] == '0' && num[1] == '0') > + return 2; ditto. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:219 > + if (num[0] == '0' && num[1] != '.') > + return 1; ditto. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:222 > + if (num[0] != '0') > + return 0; 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:238 > + if (d < 0) { > + isNegative = true; > + d = -d; > + StringBuilder::append("-", 1); 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:276 > + if (!precision) { > + if (m_exponent < 0) { > + m_significand[2] = m_significand[1]; 3 space indentation, and 2 space indentation. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:284 > + for (; i < digitsBeforeDecimalPoint && i < sizeOfsignificand; ++i) { > + *pointer = m_significand[i]; 2 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:289 > + if (m_significand[i] > '4') { > + toShif = true; ditto. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:300 > + if (m_significand[0] == '0') { > + maxLimit--; 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:305 > + } else > + jump = true; 3 space indentation. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:310 > + if (jump) { > + for (int i = 0; i < numberOfZeros; i++) { > + if (i == 1 && !dotAlreadyWritten) { > + *pointer = dot; 3 space indentations > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:319 > + if (maxLimit == precision) { > + if (numberOfZeros > precision + 1 || (numberOfZeros == (precision + 1) && m_significand[0] < '5')) { > + pointer = &number[1]; 3 space indentation and 2 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:324 > + if (toShif) > + from = shifting(&number[0], valueOfShift); 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:330 > + if (numberOfZeros == precision + 1 && m_significand[0] > '4') { > + pointer[-1] = '1'; 2 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:334 > + if (toShif) > + from = shifting(&number[0], valueOfShift); 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:343 > + for (int i = 0; i < sizeOfsignificand; i++) { > + if (i == placeOfDot + 1 && sizeOfsignificand != i && !dotAlreadyWritten) { > + *pointer = dot; 3 space indentations > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:351 > + if (maxLimit == precision) { > + if (i + 1 < sizeOfMSignificand && m_significand[i + 1] < '5') { > + while (*pointer == '0' && dotAlreadyWritten) 3 space indentation, and 2 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:354 > + if (*pointer == dot) > + *pointer = '\0'; 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:358 > + if (toShif) > + from = shifting(&number[0], valueOfShift); 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:365 > + if (m_significand[i] == '9') { > + while (*pointer == '9' && *pointer != dot) > + pointer--; 2 space indentations > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:368 > + if (*pointer == dot) > + pointer--; 5 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:370 > + pointer[1] = '\0'; Unnecessary 1 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:373 > + if (toShif) > + from = shifting(&number[0], valueOfShift); 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:383 > + if (toShif) > + from = shifting(&number[0], valueOfShift); 2 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:393 > + for (int i = 0; i < (m_exponent - sizeOfsignificand) + 1; i++) { > + *pointer = zero; > + pointer++; 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:399 > + if (toShif) > + from = shifting(&number[0], valueOfShift); 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:407 > + if (n < 0) { > + StringBuilder::append("-", 1); 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:412 > + if (!(n / 10)) { > + char c = static_cast<char>(n + '0'); ditto. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:424 > + do { > + *pointer = (n % 10) + '0'; 3 space indentation > Source/JavaScriptCore/wtf/text/StringBuilder.h:82 > + static unsigned getPrecision(int m_exponent, unsigned m_precision, unsigned digitsBeforeDecimalPoint); Do not prepend 'm_' for argument names.
Darin Adler
Comment 32 2011-10-23 22:12:52 PDT
Comment on attachment 112126 [details] Fix CSSPrimitiveValue::cssText() to use StringBuilder and add two StringBuilder append overload View in context: https://bugs.webkit.org/attachment.cgi?id=112126&action=review > Source/JavaScriptCore/wtf/text/StringBuilder.h:31 > +#include <math.h> > +#include <wtf/MathExtras.h> > +#include <wtf/dtoa.h> No need to add these includes to the header. Please don’t. > Source/JavaScriptCore/wtf/text/StringBuilder.h:84 > + static unsigned getPrecision(int m_exponent, unsigned m_precision, unsigned digitsBeforeDecimalPoint); > + > + static int shifting(char* num, int shift); I don’t think these need to be public functions. They could be private to the .cpp file and use “static” to get external linkage. If we decide to make them public to share them with other code, we probably would not put them in the StringBuilder class. In fact, longer term functions that convert numbers to strings don’t necessarily belong in StringBuilder. The names here are not normal WebKit function names. We do not use “get” for name of something that returns a value (see WebKit coding style guide), and the name seems too terse. It says “precision”, but precision of what? Needs a name that actually says what it does. And “shifting” is also a curious name for a function. Normally functions that return values are named what they return. If this returns a “shifting” then we have an unconventional use of English grammar here. Also, the argument’s name should not be “num”. > Source/JavaScriptCore/wtf/text/StringBuilder.h:88 > + void append(double); > + > + void append(int); I’m not sure that overloading based on type is quite right here, since the format that is used is based on the type and the dependency on type might be subtle. We may want to give more specific names to these functions as we do to the conversion functions in String.h. We should refactor this so it shares code with functions in String.h and StringImpl.h.
Oliver Varga
Comment 33 2011-11-03 06:20:48 PDT
Created attachment 113473 [details] Correcting I made the previous requests: * I corrected the indentation, and rename some variables and functions. The next step, I will do shortly: * I am going to create a new cpp and header file what name is NumericFormatting.h/cpp. * It will includes low level numeric formatting functions, that allows higher level classes like String and StringBuilder to use them efficiently, so the StringBuilder::append(double) would call the NumericFormatting::doubleToAsciiUsedByDtoa.
Darin Adler
Comment 34 2011-11-03 09:53:36 PDT
(In reply to comment #33) > NumericFormatting::doubleToAsciiUsedByDtoa. I like the idea behind this patch but not this name. For one thing, we spell it ASCII, not Ascii. But also "double to ASCII used by dtoa" is a confusing phrase and I think we can come up with a more straightforward name.
Darin Adler
Comment 35 2011-11-03 10:00:25 PDT
Comment on attachment 113473 [details] Correcting View in context: https://bugs.webkit.org/attachment.cgi?id=113473&action=review I appreciate your continuing to work hard on this patch; it’s worth doing. I think there is still some work needed. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:197 > +int StringBuilder::firstDigitOfOriginalNumber(char* numberToShifting, int measurementOfShift) I don’t understand the meaning of the name “number to shifting". > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:202 > + numberToShifting[ p ] = numberToShifting[p+1]; Should omit the spaces around the "p". Should include spaces around the "+". > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:218 > + numberToShifting[i]=0; Missing spaces here. > Source/JavaScriptCore/wtf/text/StringBuilder.h:141 > + static unsigned precisionOfResult(int, unsigned, unsigned); > + static int firstDigitOfOriginalNumber(char*, int); These should go into NumericFormatting.h/cpp, not this class. I am puzzled. Why is it we need this new code and can’t use the DecimalNumber class that CSSPrimitiveValue’s formatNumber was using? The argument names here need to be listed. It’s not at all clear what the arguments are. The name “first digit of original number” does not make it clear that the function will have a side effect of changing the passed in character buffer. > Source/WebCore/css/CSSPrimitiveValue.cpp:828 > + text.append(result.toString()); We should make it so you can append one StringBuilder to another. This toString() seems like bad idea. > Source/WebCore/css/CSSPrimitiveValue.cpp:851 > + text.append(result.toString()); We should make it so you can append one StringBuilder to another. This toString() seems like bad idea. > Source/WebCore/css/CSSPrimitiveValue.cpp:871 > + text.append(result.toString()); We should make it so you can append one StringBuilder to another. This toString() seems like bad idea. Also, incorrect indent here. > Source/WebCore/css/CSSPrimitiveValue.cpp:961 > + String resultOfText = text.toString(); I think this could just be named “result”. The phrase “result of text” is not good grammar here. If you really wanted both words it would just be “result text” so, resultText.
Oliver Varga
Comment 36 2011-11-07 07:54:03 PST
Thank you for your comment, I am goint to check your new instructions shortly.
Szilard Ledan
Comment 37 2012-01-09 07:00:27 PST
Created attachment 121666 [details] Correcting v2 Added a new class: NumericFormatting.h/cpp. The StringBuilder::append(double) uses it. Modified CSSPrimitiveValue::customCssText() to use StringBuilder instead of string.
WebKit Review Bot
Comment 38 2012-01-09 07:32:47 PST
Comment on attachment 121666 [details] Correcting v2 Attachment 121666 [details] did not pass chromium-ews (chromium-xvfb): Output: http://queues.webkit.org/results/11187504
Gyuyoung Kim
Comment 39 2012-01-09 07:39:23 PST
Comment on attachment 121666 [details] Correcting v2 Attachment 121666 [details] did not pass efl-ews (efl): Output: http://queues.webkit.org/results/11183501
Gustavo Noronha (kov)
Comment 40 2012-01-09 08:06:18 PST
Comment on attachment 121666 [details] Correcting v2 Attachment 121666 [details] did not pass gtk-ews (gtk): Output: http://queues.webkit.org/results/11187518
Darin Adler
Comment 41 2012-01-09 15:25:59 PST
Comment on attachment 121666 [details] Correcting v2 View in context: https://bugs.webkit.org/attachment.cgi?id=121666&action=review I didn’t have time to review the whole thing, but I have a few initial comments. > Source/JavaScriptCore/wtf/text/NumericFormatting.h:4 > + * Copyright (C) 2011 University of Szeged > + * Copyright (C) 2011 Oliver Varga > + * Copyright (C) 2012 Szilard Ledan Seems like too much copyright for these two function declarations. Did all of these contribute to this? > Source/JavaScriptCore/wtf/text/NumericFormatting.h:31 > +#include "string.h" This include is not needed and should be removed, but if it was needed it would be <string.h>. > Source/JavaScriptCore/wtf/text/NumericFormatting.h:44 > +class NumericFormatting { > +public: > + // Is is used by append(double). Return the precision of the the result number. > + unsigned precisionOfResult(int exponent, unsigned precision, unsigned digitsBeforeDecimalPoint); > + > + // Is is used by append(double). If the input number is like '999.999', and the value of the rounding is 0 we have to move forward the carry > + // over the decimal point. This kind of rounding implemented the number less then 1 and more than 0, and before the rounding we convert '999.999' > + // to '0.999999'. The firstDigitOfOriginalNumber() helps get the real number back. > + int firstDigitOfOriginalNumber(char* numberToShifting, int measurementOfShift); > +}; These are functions, not a class. They could be free functions, or if you really want this to be a class, they should be static member functions, not member functions. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:34 > #include "config.h" > #include "StringBuilder.h" > +#include "NumericFormatting.h" > +#include <wtf/MathExtras.h> > +#include <wtf/dtoa.h> > > #include "WTFString.h" > > +#include <stdio.h> This is incorrect. All the includes except for "StringBuilder.h" should be in a single paragraph, and sorted. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:303 > + StringBuilder::append("-", 1); This should be: append('-'); > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:317 > + printf("debug: exponent:%d precision:%d\n", exponent, precision); Please don't submit the patch with the printf still here. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:323 > + int sizeOfsignificand = strlen(significand); The word significand should be capitalized. > Source/JavaScriptCore/wtf/text/StringBuilder.cpp:326 > + int sizeOfMSignificand = sizeof(significand); What is this? What does the “M” mean?
Antonio Gomes
Comment 42 2012-02-25 13:00:34 PST
Comment on attachment 121666 [details] Correcting v2 based on Darin's review and lack of update.
Brent Fulgham
Comment 43 2022-07-12 15:13:42 PDT
I think Ben Poulain made similar improvements when porting to Arm in 2014. Current sources seem to use StringBuilder.
Note You need to log in before you can comment on or make changes to this bug.