- Revision
- 124179
- Author
- [email protected]
- Date
- 2012-07-31 00:12:23 -0700 (Tue, 31 Jul 2012)
Log Message
IndexedDB: Size the Vector in encodeInt/encodeVarInt/encodeString
https://bugs.webkit.org/show_bug.cgi?id=91813
Patch by Xingnan Wang <[email protected]> on 2012-07-31
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 (124178 => 124179)
--- trunk/Source/WebCore/ChangeLog 2012-07-31 06:55:55 UTC (rev 124178)
+++ trunk/Source/WebCore/ChangeLog 2012-07-31 07:12:23 UTC (rev 124179)
@@ -1,3 +1,21 @@
+2012-07-31 Xingnan Wang <[email protected]>
+
+ 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-07-30 Huang Dongsung <[email protected]>
[Texmap] Remove the backing store after 'style.visibility' for an element sets 'hidden'.
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.cpp (124178 => 124179)
--- trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.cpp 2012-07-31 06:55:55 UTC (rev 124178)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.cpp 2012-07-31 07:12:23 UTC (rev 124179)
@@ -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;
}
@@ -184,8 +186,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;
}
@@ -199,7 +203,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;
@@ -207,6 +211,7 @@
n >>= 8;
} while (n);
+ ASSERT(ret.size() <= DefaultInlineBufferSize);
return ret;
}
@@ -242,7 +247,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;
@@ -252,6 +257,7 @@
ret.append(c);
} while (n);
+ ASSERT(ret.size() <= DefaultInlineBufferSize);
return ret;
}
@@ -274,14 +280,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;
@@ -364,9 +370,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;
}
@@ -383,12 +390,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());
@@ -640,7 +647,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()));
@@ -884,12 +891,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 (124178 => 124179)
--- trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.h 2012-07-31 06:55:55 UTC (rev 124178)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.h 2012-07-31 07:12:23 UTC (rev 124179)
@@ -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);
Vector<char> maxIDBKey();
Vector<char> minIDBKey();
@@ -59,7 +63,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 (124178 => 124179)
--- trunk/Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp 2012-07-31 06:55:55 UTC (rev 124178)
+++ trunk/Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp 2012-07-31 07:12:23 UTC (rev 124179)
@@ -187,8 +187,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(0x7fffffffffffffff).size());
#ifdef NDEBUG
- EXPECT_EQ(static_cast<size_t>(8), encodeInt(-100).size());
+ EXPECT_EQ(static_cast<size_t>(10), encodeVarInt(-100).size());
#endif
}