javascript - 如何衡量 promise 的执行时间?

标签 javascript typescript es6-promise

我正在尝试编写一个函数来测量另一个函数的执行时间:

export class Profiler {
    public measureSyncFunc(fn: () => any): Promise<number> {
        return new Promise<number>((resolve, reject) => {
            let elapsed = 0;

            let intervalId = window.setInterval(() => {
                elapsed += 1; // this is never called
            }, 1);

            this.execFunc(fn)
                .then((result: any) => {
                    window.clearInterval(intervalId);
                    resolve(elapsed);
                });
        });
    }

    private execFunc(fn: () => any): Promise<any> {
        return new Promise<any>((resolve, reject) => {
            resolve(fn());
        });
    }
}

然后我就这样使用它:

let array = generateRandomArray(100000);

instance.measureSyncFunc(bubbleSort(array))
    .then((elapsed: number) => {
        console.log(`end session: ${elapsed} seconds`);
        resolve();
    });

bubbleSort 函数是同步的,需要几秒钟才能完成。 见代码 here :

控制台的结果是“结束 session :0 秒”,因为从未调用间隔回调。

你知道我怎么调用它吗? 非常感谢你们!

最佳答案

如果您要衡量的功能始终是同步的,那么实际上就没有必要涉及 promise 。

由于您要测试的函数采用参数,因此最好将其包装在箭头函数中,以便能够使用另一个上下文调用它,而不必自己管理它的参数。

像这样简单的东西就可以了。

function measure(fn: () => void): number {
    let start = performance.now();
    fn();
    return performance.now() - start;
}

function longRunningFunction(n: number) {
    for (let i = 0; i < n; i++) {
        console.log(i);
    }
}

let duration = measure(() => {
    longRunningFunction(100);
});

console.log(`took ${duration} ms`);

如果你想测量一个异步函数(如果它返回一个 promise )来解析所花费的时间,你可以轻松地将代码更改为这样的东西:

function measurePromise(fn: () => Promise<any>): Promise<number> {
    let onPromiseDone = () => performance.now() - start;

    let start = performance.now();
    return fn().then(onPromiseDone, onPromiseDone);
}

function longPromise(delay: number) {
    return new Promise<string>((resolve) => {
        setTimeout(() => {
            resolve('Done');
        }, delay);
    });
}

measurePromise(() => longPromise(300))
    .then((duration) => {
        console.log(`promise took ${duration} ms`);
    });

注意:此解决方案使用 ES6 Promise,如果您使用的是其他东西,则可能需要对其进行调整,但逻辑应该是相同的。

您可以在 playground 中看到这两个示例 here .

关于javascript - 如何衡量 promise 的执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44158044/

相关文章:

javascript - 如何在同一个 Nodejs 项目中混合 CoffeeScript 和 typescript 文件?

Typescript 不强制使用函数参数中的类型

javascript - 如何自动调用System或AMD模块?

javascript - 如何在reactjs中使用await每2分钟调用一次操作

javascript - 流畅的异步 api 与 ES6 代理 javascript

javascript - 单击更改 anchor 文本...?也许是 jQuery?

javascript - 页面加载准备就绪时加载选项卡中的内容

javascript - 如何在更改选项卡(焦点)时暂停递归 setTimeout

node.js - 如何解析 Node.js mssql promise

javascript - 如何将 html 属性中的 a\n 转义为 js 字符串?