Changeset 95682 in webkit


Ignore:
Timestamp:
Sep 21, 2011 4:44:20 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

IndexedDB: compare strings without decoding
https://bugs.webkit.org/show_bug.cgi?id=68554

Patch by Joshua Bell <jsbell@chromium.org> on 2011-09-21
Reviewed by Tony Chang.

Resolves a FIXME in IndexedDB that was also identified as a hotspot
during profiling. Yields a small performance improvement.

  • Source/WebCore/storage/IDBLevelDBCoding.cpp:
  • Source/WebCore/storage/IDBLevelDBCoding.h:
  • Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:
Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/ChangeLog

    r95665 r95682  
    1 2011-09-21  Leandro Pereira  <leandro@profusion.mobi>
     12011-09-21  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: compare strings without decoding
     4        https://bugs.webkit.org/show_bug.cgi?id=68554
     5
     6        Reviewed by Tony Chang.
     7
     8        Resolves a FIXME in IndexedDB that was also identified as a hotspot
     9        during profiling. Yields a small performance improvement.
     10
     11        * Source/WebCore/storage/IDBLevelDBCoding.cpp:
     12        * Source/WebCore/storage/IDBLevelDBCoding.h:
     13        * Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:
     14
     15011-09-21  Leandro Pereira  <leandro@profusion.mobi>
    216
    317        Unreviewed. Remove unused ENABLE_AS_IMAGE flag after r95234 from
  • trunk/Source/WebCore/storage/IDBLevelDBCoding.cpp

    r95373 r95682  
    299299    p += len * 2;
    300300    return p;
     301}
     302
     303int compareEncodedStringsWithLength(const char* p, const char* limitP, const char* q, const char* limitQ)
     304{
     305    ASSERT(limitP >= p);
     306    ASSERT(limitQ >= q);
     307    int64_t lenP, lenQ;
     308    p = decodeVarInt(p, limitP, lenP);
     309    q = decodeVarInt(q, limitQ, lenQ);
     310    ASSERT(p && q);
     311    ASSERT(lenP >= 0);
     312    ASSERT(lenQ >= 0);
     313    ASSERT(p + lenP * 2 <= limitP);
     314    ASSERT(q + lenQ * 2 <= limitQ);
     315
     316    const size_t lmin = static_cast<size_t>(lenP < lenQ ? lenP : lenQ);
     317    if (int x = memcmp(p, q, lmin * 2))
     318        return x;
     319
     320    if (lenP == lenQ)
     321        return 0;
     322
     323    return (lenP > lenQ) ? 1 : -1;
    301324}
    302325
     
    442465    unsigned char typeB = *q++;
    443466
    444     String s, t;
    445467    double d, e;
    446468
     
    455477    case kIDBKeyStringTypeByte:
    456478        // String type.
    457         p = decodeStringWithLength(p, limitA, s); // FIXME: Compare without actually decoding the String!
    458         ASSERT(p);
    459         q = decodeStringWithLength(q, limitB, t);
    460         ASSERT(q);
    461         return codePointCompare(s, t);
     479        return compareEncodedStringsWithLength(p, limitA, q, limitB);
    462480    case kIDBKeyDateTypeByte:
    463481    case kIDBKeyNumberTypeByte:
  • trunk/Source/WebCore/storage/IDBLevelDBCoding.h

    r95373 r95682  
    5454Vector<char> encodeStringWithLength(const String&);
    5555const char* decodeStringWithLength(const char* p, const char* limit, String& foundString);
     56int compareEncodedStringsWithLength(const char* p, const char* limitP, const char* q, const char* limitQ);
    5657Vector<char> encodeDouble(double);
    5758const char* decodeDouble(const char* p, const char* limit, double*);
  • trunk/Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp

    r95373 r95682  
    231231}
    232232
     233TEST(IDBLevelDBCodingTest, CompareEncodedStringsWithLength)
     234{
     235    const UChar testStringA[] = {0x1000, 0x1000, '\0'};
     236    const UChar testStringB[] = {0x1000, 0x1000, 0x1000, '\0'};
     237    const UChar testStringC[] = {0x1000, 0x1000, 0x1001, '\0'};
     238    const UChar testStringD[] = {0x1001, 0x1000, 0x1000, '\0'};
     239    const UChar testStringE[] = {0xd834, 0xdd1e, '\0'};
     240    const UChar testStringF[] = {0xfffd, '\0'};
     241
     242    Vector<String> testCases;
     243    testCases.append(String(""));
     244    testCases.append(String("a"));
     245    testCases.append(String("b"));
     246    testCases.append(String("baaa"));
     247    testCases.append(String("baab"));
     248    testCases.append(String("c"));
     249    testCases.append(String(testStringA));
     250    testCases.append(String(testStringB));
     251    testCases.append(String(testStringC));
     252    testCases.append(String(testStringD));
     253    testCases.append(String(testStringE));
     254    testCases.append(String(testStringF));
     255
     256    for (size_t i = 0; i < testCases.size() - 1; ++i) {
     257        String a = testCases[i];
     258        String b = testCases[i + 1];
     259
     260        EXPECT_LT(codePointCompare(a, b), 0);
     261        EXPECT_GT(codePointCompare(b, a), 0);
     262        EXPECT_EQ(codePointCompare(a, a), 0);
     263        EXPECT_EQ(codePointCompare(b, b), 0);
     264
     265        Vector<char> encodedA = encodeStringWithLength(a);
     266        EXPECT_TRUE(encodedA.size());
     267        Vector<char> encodedB = encodeStringWithLength(b);
     268        EXPECT_TRUE(encodedA.size());
     269
     270        const char* p = encodedA.data();
     271        const char* limitP = p + encodedA.size();
     272        const char* q = encodedB.data();
     273        const char* limitQ = q + encodedB.size();
     274
     275        EXPECT_LT(compareEncodedStringsWithLength(p, limitP, q, limitQ), 0);
     276        EXPECT_GT(compareEncodedStringsWithLength(q, limitQ, p, limitP), 0);
     277        EXPECT_EQ(compareEncodedStringsWithLength(p, limitP, p, limitP), 0);
     278        EXPECT_EQ(compareEncodedStringsWithLength(q, limitQ, q, limitQ), 0);
     279    }
     280}
     281
    233282TEST(IDBLevelDBCodingTest, EncodeDouble)
    234283{
     
    303352    keys.append(IDBKey::createString("b"));
    304353    keys.append(IDBKey::createString("baaa"));
     354    keys.append(IDBKey::createString("baab"));
     355    keys.append(IDBKey::createString("c"));
    305356
    306357    for (size_t i = 0; i < keys.size() - 1; ++i) {
Note: See TracChangeset for help on using the changeset viewer.