Node.js/v8: как сделать мой собственный снимок для ускорения запуска

У меня есть приложение node.js(v0.6.12), которое начинается с оценки файла Javascript, startup.js. Для оценки startup.js требуется много времени, и я хотел бы "испечь его" в пользовательскую сборку Node, если это возможно.

Исходный каталог v8, распространяемый с помощью Node, node/deps/v8/src, содержит SconScript, который может быть почти использован для этого. В строке 302 имеем

LIBRARY_FILES = '''
runtime.js
v8natives.js
array.js
string.js
uri.js
math.js
messages.js
apinatives.js
date.js
regexp.js
json.js
liveedit-debugger.js
mirror-debugger.js
debug-debugger.js
'''.split()

Эти файлы javascript присутствуют в одном каталоге. Что-то в процессе сборки, по-видимому, оценивает их, принимает моментальный снимок состояния и сохраняет его как байтовую строку в node/out/Release/obj/release/snapshot.cc(в Mac OS). Этот файл, кажется, запечен в node.

Некоторая настройка моментального снимка запуска возможна, изменяя SconScript. Например, я могу изменить определение встроенной Date.toString, изменив date.js. Я могу даже добавить новые глобальные переменные, добавив startup.js в список файлов библиотеки, с содержимым global.test = 1.

Однако я не могу поместить только код javascript в startup.js. Если он содержит Date.toString = 1;, возникает ошибка, даже если код верен в Node repl:

Build failed:  -> task failed (err #2): 
    {task: libv8.a SConstruct -> libv8.a}
make: *** [program] Error 1

И он явно не может использовать код, который зависит от библиотек Node добавляет к v8. global.underscore = require('underscore'); вызывает ту же ошибку.

Мне идеально понравился инструмент customSnapshot, где customSnapshot startup.js оценивает startup.js с помощью Node, а затем выгружает моментальный снимок в файл snapshot.cc, который я могу поместить в исходный каталог Node. Затем я смогу построить Node и скажу, чтобы он не восстанавливал моментальный снимок.

Ответ 1

Я только что добавил параметр команды mksnapshot (который выполняется во время сборки V8). Новый флаг --extra-file = filename.js позволяет указать файл, который должен быть загружен и запущен в процессе, а затем установить моментальный снимок. Он находится на внешней линии V8, а не на ветке 3.11, которая используется для node 0.8, поэтому вам нужно будет запустить node 0.8 с V8 версии 3.11. Насколько я знаю, в данный момент это работает, но вы будете несколько по-своему.

Пожалуйста, напишите ошибки, если вы попробуете это, и это не сработает для вас.