Title: [124865] trunk/Source
Revision
124865
Author
commit-qu...@webkit.org
Date
2012-08-07 01:16:37 -0700 (Tue, 07 Aug 2012)

Log Message

IndexedDB: Size the Vector in encodeInt/encodeVarInt/encodeString
https://bugs.webkit.org/show_bug.cgi?id=91813

Patch by Xingnan Wang <xingnan.w...@intel.com> on 2012-08-07
Reviewed by Kentaro Hara.

To avoid memory re-allocation in Vector, init the capability or size of Vector in encodeInt(), encodeVarInt(),
encodeBool(), encodeIDBKey() etc.

No new tests - Low level functions covered by existing layout tests and also covered by Chromium
webkit_unit_tests IDBLevelIDBCodingTest.* which validates the sizes of buffers returned by encodeVarInt.

* Modules/indexeddb/IDBLevelDBCoding.cpp:
(WebCore::IDBLevelDBCoding::encodeInt):
(WebCore::IDBLevelDBCoding::encodeVarInt):
(WebCore::IDBLevelDBCoding::encodeString):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (124864 => 124865)


--- trunk/Source/WebCore/ChangeLog	2012-08-07 08:15:43 UTC (rev 124864)
+++ trunk/Source/WebCore/ChangeLog	2012-08-07 08:16:37 UTC (rev 124865)
@@ -1,3 +1,21 @@
+2012-08-07  Xingnan Wang  <xingnan.w...@intel.com>
+
+        IndexedDB: Size the Vector in encodeInt/encodeVarInt/encodeString
+        https://bugs.webkit.org/show_bug.cgi?id=91813
+
+        Reviewed by Kentaro Hara.
+
+        To avoid memory re-allocation in Vector, init the capability or size of Vector in encodeInt(), encodeVarInt(),
+        encodeBool(), encodeIDBKey() etc.
+
+        No new tests - Low level functions covered by existing layout tests and also covered by Chromium
+        webkit_unit_tests IDBLevelIDBCodingTest.* which validates the sizes of buffers returned by encodeVarInt.
+
+        * Modules/indexeddb/IDBLevelDBCoding.cpp:
+        (WebCore::IDBLevelDBCoding::encodeInt):
+        (WebCore::IDBLevelDBCoding::encodeVarInt):
+        (WebCore::IDBLevelDBCoding::encodeString):
+
 2012-08-06  Arko Saha  <a...@motorola.com>
 
         Microdata: itemType[index] must be undefined for out-of-range index.

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.cpp (124864 => 124865)


--- trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.cpp	2012-08-07 08:15:43 UTC (rev 124864)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.cpp	2012-08-07 08:16:37 UTC (rev 124865)
@@ -167,8 +167,10 @@
 
 Vector<char> encodeByte(unsigned char c)
 {
-    Vector<char> v;
+    Vector<char, DefaultInlineBufferSize> v;
     v.append(c);
+
+    ASSERT(v.size() <= DefaultInlineBufferSize);
     return v;
 }
 
@@ -193,8 +195,10 @@
 
 Vector<char> encodeBool(bool b)
 {
-    Vector<char> ret(1);
-    ret[0] = b ? 1 : 0;
+    Vector<char, DefaultInlineBufferSize> ret;
+    ret.append(b ? 1 : 0);
+
+    ASSERT(ret.size() <= DefaultInlineBufferSize);
     return ret;
 }
 
@@ -208,7 +212,7 @@
 {
     ASSERT(nParam >= 0);
     uint64_t n = static_cast<uint64_t>(nParam);
-    Vector<char> ret; // FIXME: Size this at creation.
+    Vector<char, DefaultInlineBufferSize> ret;
 
     do {
         unsigned char c = n;
@@ -216,6 +220,7 @@
         n >>= 8;
     } while (n);
 
+    ASSERT(ret.size() <= DefaultInlineBufferSize);
     return ret;
 }
 
@@ -251,7 +256,7 @@
 {
     ASSERT(nParam >= 0);
     uint64_t n = static_cast<uint64_t>(nParam);
-    Vector<char> ret; // FIXME: Size this at creation.
+    Vector<char, DefaultInlineBufferSize> ret;
 
     do {
         unsigned char c = n & 0x7f;
@@ -261,6 +266,7 @@
         ret.append(c);
     } while (n);
 
+    ASSERT(ret.size() <= DefaultInlineBufferSize);
     return ret;
 }
 
@@ -283,14 +289,14 @@
 
 Vector<char> encodeString(const String& s)
 {
-    Vector<char> ret; // FIXME: Size this at creation.
+    Vector<char> ret(s.length() * 2);
 
     for (unsigned i = 0; i < s.length(); ++i) {
         UChar u = s[i];
         unsigned char hi = u >> 8;
         unsigned char lo = u;
-        ret.append(hi);
-        ret.append(lo);
+        ret[2 * i] = hi;
+        ret[2 * i + 1] = lo;
     }
 
     return ret;
@@ -373,9 +379,10 @@
 {
     // FIXME: It would be nice if we could be byte order independent.
     const char* p = reinterpret_cast<char*>(&x);
-    Vector<char> v;
+    Vector<char, DefaultInlineBufferSize> v;
     v.append(p, sizeof(x));
-    ASSERT(v.size() == sizeof(x));
+
+    ASSERT(v.size() <= DefaultInlineBufferSize);
     return v;
 }
 
@@ -392,12 +399,12 @@
 
 Vector<char> encodeIDBKey(const IDBKey& key)
 {
-    Vector<char> ret;
+    Vector<char, DefaultInlineBufferSize> ret;
     encodeIDBKey(key, ret);
     return ret;
 }
 
-void encodeIDBKey(const IDBKey& key, Vector<char>& into)
+void encodeIDBKey(const IDBKey& key, Vector<char, DefaultInlineBufferSize>& into)
 {
     size_t previousSize = into.size();
     ASSERT(key.isValid());
@@ -649,7 +656,7 @@
     // May be typed, or may be a raw string. An invalid leading
     // byte is used to identify typed coding. New records are
     // always written as typed.
-    Vector<char> ret;
+    Vector<char, DefaultInlineBufferSize> ret;
     ret.append(IDBKeyPathTypeCodedByte1);
     ret.append(IDBKeyPathTypeCodedByte2);
     ret.append(static_cast<char>(keyPath.type()));
@@ -893,12 +900,13 @@
 
 
     unsigned char firstByte = (databaseIdString.size() - 1) << 5 | (objectStoreIdString.size() - 1) << 2 | (indexIdString.size() - 1);
-    Vector<char> ret;
+    Vector<char, DefaultInlineBufferSize> ret;
     ret.append(firstByte);
     ret.append(databaseIdString);
     ret.append(objectStoreIdString);
     ret.append(indexIdString);
 
+    ASSERT(ret.size() <= DefaultInlineBufferSize);
     return ret;
 }
 

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.h (124864 => 124865)


--- trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.h	2012-08-07 08:15:43 UTC (rev 124864)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.h	2012-08-07 08:16:37 UTC (rev 124865)
@@ -43,6 +43,10 @@
 
 const unsigned char MinimumIndexId = 30;
 
+// As most of the IDBKeys and encoded values are short, we initialize some Vectors with a default inline buffer size
+// to reduce the memory re-allocations when the Vectors are appended.
+static const size_t DefaultInlineBufferSize = 32;
+
 Vector<char> encodeByte(unsigned char);
 const char* decodeByte(const char* p, const char* limit, unsigned char& foundChar);
 Vector<char> maxIDBKey();
@@ -60,7 +64,7 @@
 int compareEncodedStringsWithLength(const char*& p, const char* limitP, const char*& q, const char* limitQ);
 Vector<char> encodeDouble(double);
 const char* decodeDouble(const char* p, const char* limit, double*);
-void encodeIDBKey(const IDBKey&, Vector<char>& into);
+void encodeIDBKey(const IDBKey&, Vector<char, DefaultInlineBufferSize>& into);
 Vector<char> encodeIDBKey(const IDBKey&);
 const char* decodeIDBKey(const char* p, const char* limit, RefPtr<IDBKey>& foundKey);
 const char* extractEncodedIDBKey(const char* start, const char* limit, Vector<char>* result);

Modified: trunk/Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp (124864 => 124865)


--- trunk/Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp	2012-08-07 08:15:43 UTC (rev 124864)
+++ trunk/Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp	2012-08-07 08:16:37 UTC (rev 124865)
@@ -205,8 +205,10 @@
     EXPECT_EQ(static_cast<size_t>(2), encodeVarInt(255).size());
     EXPECT_EQ(static_cast<size_t>(2), encodeVarInt(256).size());
     EXPECT_EQ(static_cast<size_t>(5), encodeVarInt(0xffffffff).size());
+    EXPECT_EQ(static_cast<size_t>(8), encodeVarInt(0xfffffffffffff).size());
+    EXPECT_EQ(static_cast<size_t>(9), encodeVarInt(0x7fffffffffffffffLL).size());
 #ifdef NDEBUG
-    EXPECT_EQ(static_cast<size_t>(8), encodeInt(-100).size());
+    EXPECT_EQ(static_cast<size_t>(10), encodeVarInt(-100).size());
 #endif
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to