You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by al...@apache.org on 2020/04/15 01:21:54 UTC

[openwhisk-wskdebug] 01/01: performance: load action sources lazily on container

This is an automated email from the ASF dual-hosted git repository.

alexkli pushed a commit to branch speed2
in repository https://gitbox.apache.org/repos/asf/openwhisk-wskdebug.git

commit 931f5fcaae7995decb3c190217c2b2089ee80361
Author: Alexander Klimetschek <ak...@adobe.com>
AuthorDate: Tue Apr 14 18:20:35 2020 -0700

    performance: load action sources lazily on container
    
    - big improvement for larger actions with many npm modules, from ~9 sec to ~4sec startup
---
 src/kinds/nodejs/mount-plain.js   |  3 ---
 src/kinds/nodejs/mount-require.js | 30 ++++++++++++++++++++----------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/src/kinds/nodejs/mount-plain.js b/src/kinds/nodejs/mount-plain.js
index 1f4557e..9298bf0 100644
--- a/src/kinds/nodejs/mount-plain.js
+++ b/src/kinds/nodejs/mount-plain.js
@@ -41,9 +41,6 @@ function load(path) {
     return fn;
 }
 
-// load and validate on /init for quick feedback
-load(path);
-
 // eslint-disable-next-line no-unused-vars
 function main(args) { // lgtm [js/unused-local-variable]
     // load code again on every new invocation
diff --git a/src/kinds/nodejs/mount-require.js b/src/kinds/nodejs/mount-require.js
index 44be9f8..6c4cbbe 100644
--- a/src/kinds/nodejs/mount-require.js
+++ b/src/kinds/nodejs/mount-require.js
@@ -26,24 +26,34 @@ const mainFn = "$$main$$";
 // name of module file (for helpful errors)
 const sourceFile = "$$sourceFile$$";
 
-// load and validate on /init for quick feedback
-try {
-    require(path);
-} catch (e) {
-    throw `Cannot load module '${sourceFile}': ${e}`;
-}
-if (typeof require(path)[mainFn] !== "function") {
-    throw `'${mainFn}' is not a function in '${sourceFile}'. Specify the right function in wskdebug using --main.`;
-}
-
 function clearEntireRequireCache() {
     Object.keys(require.cache).forEach(function(key) {
         delete require.cache[key];
     });
 }
 
+let firstRun = true;
+
 // eslint-disable-next-line no-unused-vars
 function main(args) { // lgtm [js/unused-local-variable]
+
+    if (firstRun) {
+        const start = Date.now();
+        console.log(`[wskdebug] loading action sources from ${sourceFile}`);
+        // validation with better error messages
+        try {
+            require(path);
+        } catch (e) {
+            throw `Cannot load module '${sourceFile}': ${e}`;
+        }
+
+        if (typeof require(path)[mainFn] !== "function") {
+            throw `'${mainFn}' is not a function in '${sourceFile}'. Specify the right function in wskdebug using --main.`;
+        }
+        firstRun = false;
+        console.log(`[wskdebug] loaded in ${Date.now() - start} ms.`);
+    }
+
     // force reload of entire mounted action on every invocation
     clearEntireRequireCache();