[WebAssembly] Optimize JS to Wasm call by removing Vector allocation
authoryusukesuzuki@slowstart.org <yusukesuzuki@slowstart.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Sep 2018 04:40:12 +0000 (04:40 +0000)
committeryusukesuzuki@slowstart.org <yusukesuzuki@slowstart.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Sep 2018 04:40:12 +0000 (04:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=189353

Reviewed by Mark Lam.

JS to Wasm call always allocates Vector for the arguments. This is really costly if the wasm function is small.
This patch adds an initial size parameter to the Vector to avoid allocations for small sized arguments.

* runtime/ArgList.h:
* wasm/js/WebAssemblyFunction.cpp:
(JSC::callWebAssemblyFunction):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235778 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ArgList.h
Source/JavaScriptCore/wasm/js/WebAssemblyFunction.cpp

index 7b8dbd5..9946087 100644 (file)
@@ -1,3 +1,17 @@
+2018-09-06  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
+
+        [WebAssembly] Optimize JS to Wasm call by removing Vector allocation
+        https://bugs.webkit.org/show_bug.cgi?id=189353
+
+        Reviewed by Mark Lam.
+
+        JS to Wasm call always allocates Vector for the arguments. This is really costly if the wasm function is small.
+        This patch adds an initial size parameter to the Vector to avoid allocations for small sized arguments.
+
+        * runtime/ArgList.h:
+        * wasm/js/WebAssemblyFunction.cpp:
+        (JSC::callWebAssemblyFunction):
+
 2018-08-31  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
 
         [JSC] Clean up StructureStubClearingWatchpoint
index ff4daa6..1ec31a4 100644 (file)
@@ -34,12 +34,11 @@ class MarkedArgumentBuffer : public RecordOverflow {
     friend class VM;
     friend class ArgList;
 
-private:
+public:
     using Base = RecordOverflow;
     static const size_t inlineCapacity = 8;
     typedef HashSet<MarkedArgumentBuffer*> ListSet;
 
-public:
     // Constructor for a read-write list, to which you may append values.
     // FIXME: Remove all clients of this API, then remove this API.
     MarkedArgumentBuffer()
index 7b9f590..02b4c24 100644 (file)
@@ -83,7 +83,7 @@ static EncodedJSValue JSC_HOST_CALL callWebAssemblyFunction(ExecState* exec)
     if (Options::useTracePoints())
         traceScope.emplace(WebAssemblyExecuteStart, WebAssemblyExecuteEnd);
 
-    Vector<JSValue> boxedArgs;
+    Vector<JSValue, MarkedArgumentBuffer::inlineCapacity> boxedArgs;
     JSWebAssemblyInstance* instance = wasmFunction->instance();
     Wasm::Instance* wasmInstance = &instance->instance();
     // When we don't use fast TLS to store the context, the JS