mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00

This patch speeds up the startup time and reduce the startup memory footprint by using V8 code cache when comiling builtin modules. The current approach is demonstrated in the `with-code-cache` Makefile target (no corresponding Windows target at the moment). 1. Build the binary normally (`src/node_code_cache_stub.cc` is used), by now `internalBinding('code_cache')` is an empty object 2. Run `tools/generate_code_cache.js` with the binary, which generates the code caches by reading source code of builtin modules off source code exposed by `require('internal/bootstrap/cache').builtinSource` and then generate a C++ file containing static char arrays of the code cache, using a format similar to `node_javascript.cc` 3. Run `configure` with the `--code-cache-path` option so that the newly generated C++ file will be used when compiling the new binary. The generated C++ file will put the cache into the `internalBinding('code_cache')` object with the module ids as keys 4. The new binary tries to read the code cache from `internalBinding('code_cache')` and use it to compile builtin modules. If the cache is used, it will put the id into `require('internal/bootstrap/cache').compiledWithCache` for bookkeeping, otherwise the id will be pushed into `require('internal/bootstrap/cache').compiledWithoutCache` This patch also added tests that verify the code cache is generated and used when compiling builtin modules. The binary with code cache: - Is ~1MB bigger than the binary without code cahe - Consumes ~1MB less memory during start up - Starts up about 60% faster PR-URL: https://github.com/nodejs/node/pull/21405 Reviewed-By: John-David Dalton <john.david.dalton@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Gus Caplan <me@gus.host>
30 lines
981 B
JavaScript
30 lines
981 B
JavaScript
'use strict';
|
|
|
|
// This is only exposed for internal build steps and testing purposes.
|
|
// We create new copies of the source and the code cache
|
|
// so the resources eventually used to compile builtin modules
|
|
// cannot be tampered with even with --expose-internals
|
|
|
|
const {
|
|
NativeModule, internalBinding
|
|
} = require('internal/bootstrap/loaders');
|
|
|
|
module.exports = {
|
|
builtinSource: Object.assign({}, NativeModule._source),
|
|
codeCache: internalBinding('code_cache'),
|
|
compiledWithoutCache: NativeModule.compiledWithoutCache,
|
|
compiledWithCache: NativeModule.compiledWithCache,
|
|
nativeModuleWrap(script) {
|
|
return NativeModule.wrap(script);
|
|
},
|
|
// Modules with source code compiled in js2c that
|
|
// cannot be compiled with the code cache
|
|
cannotUseCache: [
|
|
'config',
|
|
// TODO(joyeecheung): update the C++ side so that
|
|
// the code cache is also used when compiling these
|
|
// two files.
|
|
'internal/bootstrap/loaders',
|
|
'internal/bootstrap/node'
|
|
]
|
|
};
|