Changeset 77297 in webkit


Ignore:
Timestamp:
Feb 1, 2011, 2:03:04 PM (15 years ago)
Author:
Patrick Gansterer
Message:

2011-02-01 Patrick Gansterer <Patrick Gansterer>

Reviewed by Darin Adler.

Avoid strlen() in AtomicString::fromUTF8
https://bugs.webkit.org/show_bug.cgi?id=50516

Add an overload to calculateStringHashFromUTF8 to get
strlen() of the input data with only one call.

This change shows about 3% performance win on the xml-parser benchmark.

  • JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
  • wtf/text/AtomicString.cpp: (WTF::AtomicString::fromUTF8):
  • wtf/unicode/UTF8.cpp: (WTF::Unicode::calculateStringHashAndLengthFromUTF8Internal): (WTF::Unicode::calculateStringHashFromUTF8): (WTF::Unicode::calculateStringHashAndLengthFromUTF8):
  • wtf/unicode/UTF8.h:
Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r77287 r77297  
     12011-02-01  Patrick Gansterer  <[email protected]>
     2
     3        Reviewed by Darin Adler.
     4
     5        Avoid strlen() in AtomicString::fromUTF8
     6        https://bugs.webkit.org/show_bug.cgi?id=50516
     7
     8        Add an overload to calculateStringHashFromUTF8 to get
     9        strlen() of the input data with only one call.
     10
     11        This change shows about 3% performance win on the xml-parser benchmark.
     12
     13        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
     14        * wtf/text/AtomicString.cpp:
     15        (WTF::AtomicString::fromUTF8):
     16        * wtf/unicode/UTF8.cpp:
     17        (WTF::Unicode::calculateStringHashAndLengthFromUTF8Internal):
     18        (WTF::Unicode::calculateStringHashFromUTF8):
     19        (WTF::Unicode::calculateStringHashAndLengthFromUTF8):
     20        * wtf/unicode/UTF8.h:
     21
    1222011-02-01  Sam Weinig  <[email protected]>
    223
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def

    r77269 r77297  
    6565    ?calculateDSTOffset@WTF@@YANNN@Z
    6666    ?calculateStringHashFromUTF8@Unicode@WTF@@YAIPBD0AAI@Z
     67    ?calculateStringHashAndLengthFromUTF8@Unicode@WTF@@YAIPBDAAI1@Z
    6768    ?calculateUTCOffset@WTF@@YAHXZ
    6869    ?calculatedFunctionName@DebuggerCallFrame@JSC@@QBE?AVUString@2@XZ
  • trunk/Source/JavaScriptCore/wtf/text/AtomicString.cpp

    r75343 r77297  
    377377    if (!characters)
    378378        return AtomicString();
    379     return fromUTF8(characters, strlen(characters));
     379
     380    HashAndUTF8Characters buffer;
     381    buffer.characters = characters;
     382    buffer.hash = calculateStringHashAndLengthFromUTF8(characters, buffer.length, buffer.utf16Length);
     383
     384    if (!buffer.hash)
     385        return AtomicString();
     386
     387    AtomicString atomicString;
     388    atomicString.m_string = addToStringTable<HashAndUTF8Characters, HashAndUTF8CharactersTranslator>(buffer);
     389    return atomicString;
    380390}
    381391
  • trunk/Source/JavaScriptCore/wtf/unicode/UTF8.cpp

    r77062 r77297  
    315315}
    316316
    317 unsigned calculateStringHashFromUTF8(const char* data, const char* dataEnd, unsigned& utf16Length)
     317static inline unsigned calculateStringHashAndLengthFromUTF8Internal(const char* data, const char* dataEnd, unsigned& dataLength, unsigned& utf16Length)
    318318{
    319319    if (!data)
     
    321321
    322322    WTF::StringHasher stringHasher;
     323    dataLength = 0;
    323324    utf16Length = 0;
    324325
    325     while (data < dataEnd) {
     326    while (data < dataEnd || (!dataEnd && *data)) {
    326327        if (isASCII(*data)) {
    327328            stringHasher.addCharacter(*data++);
     329            dataLength++;
    328330            utf16Length++;
    329331            continue;
     
    331333
    332334        int utf8SequenceLength = inlineUTF8SequenceLengthNonASCII(*data);
    333 
    334         if (dataEnd - data < utf8SequenceLength)
    335             return false;
     335        dataLength += utf8SequenceLength;
     336
     337        if (!dataEnd) {
     338            for (int i = 1; i < utf8SequenceLength; ++i) {
     339                if (!data[i])
     340                    return 0;
     341            }
     342        } else if (dataEnd - data < utf8SequenceLength)
     343            return 0;
    336344
    337345        if (!isLegalUTF8(reinterpret_cast<const unsigned char*>(data), utf8SequenceLength))
     
    356364
    357365    return stringHasher.hash();
     366}
     367
     368unsigned calculateStringHashFromUTF8(const char* data, const char* dataEnd, unsigned& utf16Length)
     369{
     370    unsigned dataLength;
     371    return calculateStringHashAndLengthFromUTF8Internal(data, dataEnd, dataLength, utf16Length);
     372}
     373
     374unsigned calculateStringHashAndLengthFromUTF8(const char* data, unsigned& dataLength, unsigned& utf16Length)
     375{
     376    return calculateStringHashAndLengthFromUTF8Internal(data, 0, dataLength, utf16Length);
    358377}
    359378
  • trunk/Source/JavaScriptCore/wtf/unicode/UTF8.h

    r73201 r77297  
    7272
    7373    unsigned calculateStringHashFromUTF8(const char* data, const char* dataEnd, unsigned& utf16Length);
     74    unsigned calculateStringHashAndLengthFromUTF8(const char* data, unsigned& dataLength, unsigned& utf16Length);
    7475
    7576    bool equalUTF16WithUTF8(const UChar* a, const UChar* aEnd, const char* b, const char* bEnd);
Note: See TracChangeset for help on using the changeset viewer.