定时JavaScript函数

时间:2014-10-25 15:56:30

标签: javascript

我正在尝试创建一个能够为其他JavaScript函数计时的函数。

基本上,它会做这样的事情:

var start = new Date().getTime();

// the function

var end = new Date().getTime();
return end - start;

但是,我希望能够在任何功能上调用它。例如,我可以说timeThisFunction(add)timeThisFunction(subtract),它会看到函数addsubtract运行多长时间。

这在JavaScript中可行吗?我知道可能涉及的范围问题。实施它的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

如果您只想对一个功能进行一次调用,那就非常简单了:

function timer(fn) {
  var start = new Date().getTime();

  fn();

  var end = new Date().getTime();
  return end - start;
}

传递函数与传递任何其他类型的值没有什么不同。

如果您需要计算需要参数的函数,只需将其包装在另一个函数中:

var millis = timer(function() { theRealFunction(something, 22); });

额外的包装函数会增加很少的开销,但对于大多数用途来说它并不重要。

同样,如果你需要计算一个期望this被绑定的函数,你可以在调用之前绑定它:

var millis = timer(someObject.someMethod.bind(someObject));

现在,所有这一切,如果你有一个JavaScript函数调用需要足够的时间让这个机制给出有意义的结果,那么可能有一些严重的性能缺陷值得研究。

答案 1 :(得分:1)

作为一个选项,你可以使用timimng函数为你执行一些工作(上下文绑定,参数传递)。

作为一个缺点,apply已知比通常的函数调用慢,所以这将不是100%准确,但如果需要的是比较同一函数的两个不同的实现,那么它可以很有用。

function timeIt(fn, context) {
        var args = Array.prototype.slice.call(arguments, 2),
            start = new Date().getTime();

        fn.apply(context, args);

        return new Date().getTime() - start;

}

示例用法是:

    function log(what, smthElse) { //ugly function for demonstration
        console.log(what + ' ' +  smthElse);
    };

    timeIt(log, null, 'hello', 'stranger');