我正在尝试创建一个能够为其他JavaScript函数计时的函数。
基本上,它会做这样的事情:
var start = new Date().getTime();
// the function
var end = new Date().getTime();
return end - start;
但是,我希望能够在任何功能上调用它。例如,我可以说timeThisFunction(add)
或timeThisFunction(subtract)
,它会看到函数add
和subtract
运行多长时间。
这在JavaScript中可行吗?我知道可能涉及的范围问题。实施它的最佳方法是什么?
答案 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');