2019年1月29日 星期二

ES7 Async performance 陷阱

在有了 Async / Await 的語法糖加持之後
感覺 Node.js 的世界突然美好了起來

終於可以用比較直覺的角度去寫程式
特別是那些習慣寫 C, Java, Python 等的人

但是在方便之餘
還是要特別小心 await 的使用情境
以避免造成效能上的問題

在下列例子中
testAsync1 會比 testAsync2 有更好的效能

因為在 testAsync1 中
我們會先用一個變數 promise2 去承接 Promise
此時,這個 Promise 裡面的操作有機會先執行
等到 await promise1 時,promise2 就差不多執行完畢 (秒數一樣)
故在 await promise2 時,promise2 應該就是一個 ready 的狀態 (ok or failed)

而在 testAsync2 中
因為我們少了那個中間變數
故在 await 時,至少一定要等待 3 秒

這就因此造成了 2 者間的差異

function getPromise() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('ok');
        }, 3000);
    });
}

async function testAsync1() {
    var date1 = new Date();

    var promise1 = getPromise();
    var promise2 = getPromise();

    var res;
    res = await promise1;
    res = await promise2;

    console.log(res, new Date() - date1);
    return Promise.resolve();
};

async function testAsync2() {
    var date1 = new Date();

    var res;
    res = await getPromise();
    res = await getPromise();

    console.log(res, new Date() - date1);
    return Promise.resolve();
};

testAsync1();
testAsync2();

執行結果如下

ok 3002
ok 6001

沒有留言:

張貼留言