you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

nodejsで実行時にスクリプトファイルを読み込んで実行する

C++などでluaを使ってよくやるスクリプトシステムと同等の仕組みを意味があるか別としてやってみた。

new Functionを使うと簡単かつJITが効く速いコードができる。

逆にこういう用途に使うであろうvmモジュールはくっそ遅い上にunstableなので使いにくい

var fs = require('fs');
var txt = fs.readFileSync('./filevm.jss');
var MAX = 1000000;
[function(){
    var TID = 'newFunction';
    var ctx = {
        hoge : 0,
        fuga : 0,
    };
    var f = new Function('"use strict";'+txt);
    var x = f();
    console.time(TID);
    try{
        x.init(ctx);
        for(var i=0;i<MAX;++i){
            x.update(ctx);
        }
    }catch(e){
        console.log(e.stack);
    }
    console.timeEnd(TID);
    console.log(ctx.hoge);
    console.log(ctx.fuga);
}].forEach(function(f){
    f();
});

スクリプト側

function init(ctx){
    ctx.hoge = 0;
    ctx.fuga = 0;
}
function update(ctx){
    ctx.hoge+=1;
    if(ctx.hoge%2===0){
     ctx.fuga+=1;
    }
}
return {
    init : init,
    update : update,
};

100万回実行して13ms

newFunction: 13ms

js側で関数やオブジェクト作ってctxに突っ込んでスクリプト側で実行もできる。

この実装方法であればnode.jsを再起動(接続中のユーザーが切断されずに)しなくてもスクリプト部分だけ再読込して実行できる