我正在使用一种可以翻译成 JavaScript 的语言。为了避免一些堆栈溢出,我通过将某些函数转换为 for 循环来应用尾调用优化。令人惊讶的是,转换并不比递归版本快。
http://jsperf.com/sldjf-lajf-lkajf-lkfadsj-f/5
递归版本:
(function recur(a0,s0){
return a0==0 ? s0 : recur(a0-1, a0+s0)
})(10000,0)
尾调用优化后:
ret3 = void 0;
a1 = 10000;
s2 = 0;
(function(){
while (!ret3) {
a1 == 0
? ret3 = s2
: (a1_tmp$ = a1 - 1 ,
s2_tmp$ = a1 + s2,
a1 = a1_tmp$,
s2 = s2_tmp$);
}
})();
ret3;
使用 Google Closure Compiler 进行一些清理后:
ret3 = 0;
a1 = 1E4;
for(s2 = 0; ret3 == 0;)
0 == a1
? ret3 = s2
: (a1_tmp$ = a1 - 1 ,
s2_tmp$ = a1 + s2,
a1 = a1_tmp$,
s2 = s2_tmp$);
c=ret3;
递归版本比“优化”版本更快!如果递归版本必须处理数千个上下文更改,这怎么可能?