Skip to content

Require perf optimization

Rodrigo Muino Tomonari requested to merge require-perf-optimization into master

Created by: ghost

Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • tests and/or benchmarks are included
  • documentation is changed or added
  • commit message follows commit guidelines

Aim to solve:

Optimize the performance of require one file in a module multiple times

How

Cache a map of the requests and filenames in the parent module

Example

"use strict";

console.time(1);

for(var i = 0; i < 100000; i++){
	require('./require.cpu.empty.js');
}

console.timeEnd(1);

var Module = module.constructor;
var _resolveFilename = Module._resolveFilename

Module._resolveFilename = function(request, parent, isMain, options) {
  var res;
  
  // performance optimize here
  if(parent.resolveFilenameCache){
    if(parent.resolveFilenameCache[request]){
      return parent.resolveFilenameCache[request]
    }
  }else{
  	parent.resolveFilenameCache = {};
  }
  
  res = _resolveFilename(request, parent, isMain, options);
  
  parent.resolveFilenameCache[request] = res;
  
  return res;
}

console.time('2');

for(var i = 0; i < 100000; i++){
	require('./require.cpu.empty.js');
}

console.timeEnd('2');
// result in node V8
1: 1178.783ms
2: 10.344ms

Profile

before: image after: image

Let me know and I'll append some tests or benchmarks if you think it's worth a try.

Merge request reports

Loading