我正在玩遞回并查看不同實作的基準。
function plusOne(xs) {
if (xs.length <= 0) return []
return [xs[0], ...plusOne(xs.slice(1))]
}
function plusOne2(xs) {
if (xs.length <= 0) return Promise.resolve([])
return plusOne2(xs.slice(1)).then(result => [xs[0] 1, ...result])
}
function plusOne3(xs, cb) {
if (xs.length <= 0) return cb([])
return plusOne3(xs.slice(1), result => cb([xs[0], ...result]))
}
當我簡單地將結果包裝在 promise 中時,我注意到第二個實作中的性能有所提高。我想知道為什么會這樣。
同樣在第三個實作中,瀏覽器不應該能夠使用這種延續傳遞樣式進行尾呼叫優化嗎?為什么它反而是最慢的?
見 perf.link
uj5u.com熱心網友回復:
當我簡單地將結果包裝在 promise 中時,我注意到第二個實作中的性能有所提高。我想知道為什么會這樣。
因為你沒有.then()最終解決它的價值的承諾,所以.then()鏈沒有被呼叫。
換句話說:它更快,因為它沒有做這項作業。
同樣在第三個實作中,瀏覽器不應該能夠使用這種延續傳遞樣式進行尾呼叫優化嗎?
您假設您的瀏覽器的 JS 引擎可以識別它可以在那里進行尾呼叫優化。例如,如果您 cb需要有關呼叫堆疊的資訊怎么辦?
uj5u.com熱心網友回復:
你不是在等待那些承諾完成。
試試這個:
async function plusOne(xs) {
if (xs.length <= 0) return []
return [xs[0] 1, ... await plusOne(xs.slice(1))]
}
await plusOne(xs)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507842.html
標籤:javascript 递归 es6-承诺 续传
下一篇:通過其父級修改嵌套的字典鍵名
