Title: [110104] trunk/Source
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"));
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to