私のアプリケーションでは、CPS スタイルに従っている JavaScript コードを生成しています。私はそのような「継続」を「使用していません」。非同期動作なし、一時停止と再開なし、コールバックなし。
コードが継続渡しスタイルのプログラミングに従っているだけです。
機能には多くの段階があり、各段階で処理が行われ、結果が継続に渡されます。
私が見つけたのは、CPS スタイルのコードのパフォーマンスが非常に悪いということです。ダイレクト スタイルで記述されたコードは、CPS スタイルのコードよりもほぼ 150 倍高速です。
以下のコードを確認してください。
以下のコードは両方とも同等です
var res = data.store.bookshelf.book.author;
ダイレクト スタイル コード:
var data = { store : { bookshelf : {book : {author:"Douglas Crockford"}}}};
var t1 = new Date().getTime();
for(var i = 0; i < 1000*1000*100; i+=1){
var temp0 = data;
var temp1 = temp0.store;
var temp2 = temp1.bookshelf;
var temp3 = temp2.book;
var temp4 = temp3.author;
var res = temp4;
}
var t2 = new Date().getTime();
console.log(t2-t1);
上記のコードは、ほぼ 95 ミリ秒で実行されます。
CPS スタイルのコード:
var data = { store : { bookshelf : {book : {author:"Douglas Crockford"}}}};
// return the variable to the continuation
function cps_VARREF(x,f){
return f(x);
}
// get the value of the property from the variable and pass it to the continuation
function cps_CHILD(x,child,f){
return f(x[child]);
}
// simply return the input value, essentially closing the continuation chain
function ret_(x){
return x;
}
var t1 = new Date().getTime();
for(var i = 0; i < 1000*1000*100; i+=1){
var res = function(c_){
return cps_VARREF(data,function(x1){
return cps_CHILD(x1,"store",function(x2){
return cps_CHILD(x2,"bookshelf",function(x3){
return cps_CHILD(x3,"book",function(x4){
return cps_CHILD(x4,"author",c_);});});});});}(ret_);
}
var t2 = new Date().getTime();
console.log(t2-t1);
上記の CPS スタイルのコードは 15000 ミリ秒で実行されます
CPS スタイルのコードを改善するためにできることはありますか? または、JavaScript は本質的に CPS スタイルのコードには適していませんか?
上記のテストは、node.js バージョン 0.6.12 で行われます。
誰かがこの問題に光を当てることができますか?
ありがとう、