module: cache regular expressions
authorEvan Lucas <evanlucas@me.com>
Tue, 17 Nov 2015 00:50:14 +0000 (18:50 -0600)
committerJames M Snell <jasnell@gmail.com>
Wed, 23 Dec 2015 16:38:33 +0000 (08:38 -0800)
None of these regular expressions will change, so there is no need to
generate them every time in hot code paths.

Provides a small performance improvement in module loading. (5-10%)

PR-URL: https://github.com/nodejs/node/pull/3869
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
lib/module.js

index 2f5f694..2d660c4 100644 (file)
@@ -11,6 +11,9 @@ const path = require('path');
 const internalModuleReadFile = process.binding('fs').internalModuleReadFile;
 const internalModuleStat = process.binding('fs').internalModuleStat;
 
+const splitRe = process.platform === 'win32' ? /[\/\\]/ : /\//;
+const isIndexRe = /^index\.\w+?$/;
+const shebangRe = /^\#\!.*/;
 
 // If obj.hasOwnProperty has been overridden, then calling
 // obj.hasOwnProperty(prop) will break.
@@ -191,7 +194,6 @@ Module._nodeModulePaths = function(from) {
   // note: this approach *only* works when the path is guaranteed
   // to be absolute.  Doing a fully-edge-case-correct path.split
   // that works on both Windows and Posix is non-trivial.
-  var splitRe = process.platform === 'win32' ? /[\/\\]/ : /\//;
   var paths = [];
   var parts = from.split(splitRe);
 
@@ -244,7 +246,7 @@ Module._resolveLookupPaths = function(request, parent) {
   // Is the parent an index module?
   // We can assume the parent has a valid extension,
   // as it already has been accepted as a module.
-  var isIndex = /^index\.\w+?$/.test(path.basename(parent.filename));
+  var isIndex = isIndexRe.test(path.basename(parent.filename));
   var parentIdPath = isIndex ? parent.id : path.dirname(parent.id);
   var id = path.resolve(parentIdPath, request);
 
@@ -377,7 +379,7 @@ var resolvedArgv;
 Module.prototype._compile = function(content, filename) {
   var self = this;
   // remove shebang
-  content = content.replace(/^\#\!.*/, '');
+  content = content.replace(shebangRe, '');
 
   function require(path) {
     return self.require(path);