- Revision
- 110104
- Author
- jsb...@chromium.org
- Date
- 2012-03-07 14:29:49 -0800 (Wed, 07 Mar 2012)
Log Message
[Chromium] IndexedDB: V8LocalContext creation in IDBKey extraction/injection is slow
https://bugs.webkit.org/show_bug.cgi?id=80358
Source/WebCore:
Cache a re-usable context (per isolate) for cases like IDB's key/SSV extraction/injection,
where no user script is run. This yields a 3x-4x performance improvement in basic IDB
operations.
Reviewed by Tony Chang.
No new tests - no behavior changes.
* bindings/v8/IDBBindingUtilities.cpp:
(WebCore::createIDBKeyFromSerializedValueAndKeyPath):
(WebCore::injectIDBKeyIntoSerializedValue):
* bindings/v8/V8Binding.h:
(WebCore::V8BindingPerIsolateData::auxiliaryContext):
(V8BindingPerIsolateData):
* bindings/v8/V8Utilities.cpp:
(WebCore::V8AuxiliaryContext::V8AuxiliaryContext):
(WebCore::V8AuxiliaryContext::~V8AuxiliaryContext):
(WebCore::V8AuxiliaryContext::auxiliaryContext):
* bindings/v8/V8Utilities.h:
(V8AuxiliaryContext):
Source/WebKit/chromium:
Reviewed by Tony Chang.
* tests/IDBBindingUtilitiesTest.cpp:
(WebCore::TEST):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (110103 => 110104)
--- trunk/Source/WebCore/ChangeLog 2012-03-07 22:21:14 UTC (rev 110103)
+++ trunk/Source/WebCore/ChangeLog 2012-03-07 22:29:49 UTC (rev 110104)
@@ -1,3 +1,29 @@
+2012-03-07 Joshua Bell <jsb...@chromium.org>
+
+ [Chromium] IndexedDB: V8LocalContext creation in IDBKey extraction/injection is slow
+ https://bugs.webkit.org/show_bug.cgi?id=80358
+
+ Cache a re-usable context (per isolate) for cases like IDB's key/SSV extraction/injection,
+ where no user script is run. This yields a 3x-4x performance improvement in basic IDB
+ operations.
+
+ Reviewed by Tony Chang.
+
+ No new tests - no behavior changes.
+
+ * bindings/v8/IDBBindingUtilities.cpp:
+ (WebCore::createIDBKeyFromSerializedValueAndKeyPath):
+ (WebCore::injectIDBKeyIntoSerializedValue):
+ * bindings/v8/V8Binding.h:
+ (WebCore::V8BindingPerIsolateData::auxiliaryContext):
+ (V8BindingPerIsolateData):
+ * bindings/v8/V8Utilities.cpp:
+ (WebCore::V8AuxiliaryContext::V8AuxiliaryContext):
+ (WebCore::V8AuxiliaryContext::~V8AuxiliaryContext):
+ (WebCore::V8AuxiliaryContext::auxiliaryContext):
+ * bindings/v8/V8Utilities.h:
+ (V8AuxiliaryContext):
+
2012-03-07 Nat Duca <nd...@chromium.org>
[chromium] Remove unused wasRecreate variable
Modified: trunk/Source/WebCore/bindings/v8/IDBBindingUtilities.cpp (110103 => 110104)
--- trunk/Source/WebCore/bindings/v8/IDBBindingUtilities.cpp 2012-03-07 22:21:14 UTC (rev 110103)
+++ trunk/Source/WebCore/bindings/v8/IDBBindingUtilities.cpp 2012-03-07 22:29:49 UTC (rev 110104)
@@ -151,7 +151,7 @@
PassRefPtr<IDBKey> createIDBKeyFromSerializedValueAndKeyPath(PassRefPtr<SerializedScriptValue> value, const Vector<String>& keyPath)
{
IDB_TRACE("createIDBKeyFromSerializedValueAndKeyPath");
- V8LocalContext localContext;
+ V8AuxiliaryContext context;
v8::Handle<v8::Value> v8Value(value->deserialize());
v8::Handle<v8::Value> v8Key(getNthValueOnKeyPath(v8Value, keyPath, keyPath.size()));
if (v8Key.IsEmpty())
@@ -162,7 +162,7 @@
PassRefPtr<SerializedScriptValue> injectIDBKeyIntoSerializedValue(PassRefPtr<IDBKey> key, PassRefPtr<SerializedScriptValue> value, const Vector<String>& keyPath)
{
IDB_TRACE("injectIDBKeyIntoSerializedValue");
- V8LocalContext localContext;
+ V8AuxiliaryContext context;
if (!keyPath.size())
return 0;
Modified: trunk/Source/WebCore/bindings/v8/V8Binding.h (110103 => 110104)
--- trunk/Source/WebCore/bindings/v8/V8Binding.h 2012-03-07 22:21:14 UTC (rev 110103)
+++ trunk/Source/WebCore/bindings/v8/V8Binding.h 2012-03-07 22:29:49 UTC (rev 110104)
@@ -129,6 +129,7 @@
DOMDataList& allStores() { return m_domDataList; }
V8HiddenPropertyName* hiddenPropertyName() { return &m_hiddenPropertyName; }
+ v8::Persistent<v8::Context>& auxiliaryContext() { return m_auxiliaryContext; }
void registerDOMDataStore(DOMDataStore* domDataStore)
{
@@ -169,6 +170,7 @@
DOMDataStore* m_domDataStore;
V8HiddenPropertyName m_hiddenPropertyName;
+ v8::Persistent<v8::Context> m_auxiliaryContext;
bool m_constructorMode;
friend class ConstructorMode;
Modified: trunk/Source/WebCore/bindings/v8/V8Utilities.cpp (110103 => 110104)
--- trunk/Source/WebCore/bindings/v8/V8Utilities.cpp 2012-03-07 22:21:14 UTC (rev 110103)
+++ trunk/Source/WebCore/bindings/v8/V8Utilities.cpp 2012-03-07 22:29:49 UTC (rev 110104)
@@ -53,18 +53,22 @@
namespace WebCore {
-V8LocalContext::V8LocalContext()
- : m_context(v8::Context::New())
+V8AuxiliaryContext::V8AuxiliaryContext()
{
- V8BindingPerIsolateData::ensureInitialized(v8::Isolate::GetCurrent());
- m_context->Enter();
+ auxiliaryContext()->Enter();
}
+V8AuxiliaryContext::~V8AuxiliaryContext()
+{
+ auxiliaryContext()->Exit();
+}
-V8LocalContext::~V8LocalContext()
+v8::Persistent<v8::Context>& V8AuxiliaryContext::auxiliaryContext()
{
- m_context->Exit();
- m_context.Dispose();
+ v8::Persistent<v8::Context>& context = V8BindingPerIsolateData::current()->auxiliaryContext();
+ if (context.IsEmpty())
+ context = v8::Context::New();
+ return context;
}
// Use an array to hold dependents. It works like a ref-counted scheme.
Modified: trunk/Source/WebCore/bindings/v8/V8Utilities.h (110103 => 110104)
--- trunk/Source/WebCore/bindings/v8/V8Utilities.h 2012-03-07 22:21:14 UTC (rev 110103)
+++ trunk/Source/WebCore/bindings/v8/V8Utilities.h 2012-03-07 22:29:49 UTC (rev 110104)
@@ -70,13 +70,13 @@
typedef unsigned CallbackAllowedValueFlags;
- class V8LocalContext {
+ class V8AuxiliaryContext {
public:
- V8LocalContext();
- virtual ~V8LocalContext();
+ V8AuxiliaryContext();
+ virtual ~V8AuxiliaryContext();
private:
v8::HandleScope m_handleScope;
- v8::Persistent<v8::Context> m_context;
+ static v8::Persistent<v8::Context>& auxiliaryContext();
};
typedef WTF::Vector<RefPtr<MessagePort>, 1> MessagePortArray;
Modified: trunk/Source/WebKit/chromium/ChangeLog (110103 => 110104)
--- trunk/Source/WebKit/chromium/ChangeLog 2012-03-07 22:21:14 UTC (rev 110103)
+++ trunk/Source/WebKit/chromium/ChangeLog 2012-03-07 22:29:49 UTC (rev 110104)
@@ -1,3 +1,13 @@
+2012-03-07 Joshua Bell <jsb...@chromium.org>
+
+ [Chromium] IndexedDB: V8LocalContext creation in IDBKey extraction/injection is slow
+ https://bugs.webkit.org/show_bug.cgi?id=80358
+
+ Reviewed by Tony Chang.
+
+ * tests/IDBBindingUtilitiesTest.cpp:
+ (WebCore::TEST):
+
2012-03-07 Scott Byer <scottb...@chromium.org>
Get ScrollAnimatorNone to handle the stop and reverse cases.
Modified: trunk/Source/WebKit/chromium/tests/IDBBindingUtilitiesTest.cpp (110103 => 110104)
--- trunk/Source/WebKit/chromium/tests/IDBBindingUtilitiesTest.cpp 2012-03-07 22:21:14 UTC (rev 110103)
+++ trunk/Source/WebKit/chromium/tests/IDBBindingUtilitiesTest.cpp 2012-03-07 22:29:49 UTC (rev 110104)
@@ -95,7 +95,7 @@
TEST(IDBKeyFromValueAndKeyPathTest, TopLevelPropertyStringValue)
{
- V8LocalContext v8context;
+ V8AuxiliaryContext v8context;
v8::Local<v8::Object> object = v8::Object::New();
object->Set(v8::String::New("foo"), v8::String::New("zoo"));
@@ -107,7 +107,7 @@
TEST(IDBKeyFromValueAndKeyPathTest, TopLevelPropertyNumberValue)
{
- V8LocalContext v8context;
+ V8AuxiliaryContext v8context;
v8::Local<v8::Object> object = v8::Object::New();
object->Set(v8::String::New("foo"), v8::Number::New(456));
@@ -119,7 +119,7 @@
TEST(IDBKeyFromValueAndKeyPathTest, SubProperty)
{
- V8LocalContext v8context;
+ V8AuxiliaryContext v8context;
v8::Local<v8::Object> object = v8::Object::New();
v8::Local<v8::Object> subProperty = v8::Object::New();
subProperty->Set(v8::String::New("bar"), v8::String::New("zee"));
@@ -133,7 +133,7 @@
TEST(InjectIDBKeyTest, TopLevelPropertyStringValue)
{
- V8LocalContext v8context;
+ V8AuxiliaryContext v8context;
v8::Local<v8::Object> object = v8::Object::New();
object->Set(v8::String::New("foo"), v8::String::New("zoo"));
@@ -145,7 +145,7 @@
TEST(InjectIDBKeyTest, SubProperty)
{
- V8LocalContext v8context;
+ V8AuxiliaryContext v8context;
v8::Local<v8::Object> object = v8::Object::New();
v8::Local<v8::Object> subProperty = v8::Object::New();
subProperty->Set(v8::String::New("bar"), v8::String::New("zee"));