gpt4 book ai didi

JavaScript:直接代码与 CPS 样式生成的代码性能比较

转载 作者:行者123 更新时间:2023-11-30 05:55:29 25 4
gpt4 key购买 nike

在我的应用程序中,我正在生成遵循 CPS 样式的 JavaScript 代码。我“不”使用任何“延续”。没有异步行为,没有暂停和恢复,也没有回调。

只是代码在 continuation passing style 之后编程。

功能有很多阶段,每个阶段都进行处理并将结果传递给它的延续。

我发现 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版本上完成的

有人可以解释一下这个问题吗?

谢谢,

最佳答案

急剧放缓至少有两个潜在原因。首先是您要用动态查找替换“ native ”属性查找。

V8 尽可能优化对象,因此访问属性更快。它不是使用哈希表按名称查找属性,而是跟踪内部“类”,以便可以从已知地址查找属性。所以 data.store 只是一个快速指针比较,以确保对象是预期的类型和索引指针加载。

虽然在 cps_CHILD 函数中,它无法进行优化,因为它不知道提前访问什么属性(并且每次调用它时它都会更改)。动态查找强制 V8 回退到哈希表查找,这比优化的静态查找慢。

另一个问题是函数调用的开销。每次将嵌套函数传递给下一个函数时,都必须重新创建它。它们不需要每次都编译,但仍然需要在新的上下文中创建。

关于JavaScript:直接代码与 CPS 样式生成的代码性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com