我需要以毫秒为单位获得执行时间。
我最初在2008年提出了这个问题。当时被接受的答案是使用
new Date().getTime()
。然而,现在我们都同意使用标准的performance.now()
API更加合适。因此,我将接受的答案更改为这个答案。
我需要以毫秒为单位获得执行时间。
我最初在2008年提出了这个问题。当时被接受的答案是使用
new Date().getTime()
。然而,现在我们都同意使用标准的performance.now()
API更加合适。因此,我将接受的答案更改为这个答案。
var startTime = performance.now()
doSomething() // <---- measured code goes between startTime and endTime
var endTime = performance.now()
console.log(`Call to doSomething took ${endTime - startTime} milliseconds`)
在
Node.js
中,需要导入performance
类。
导入性能类。
const { performance } = require('perf_hooks');
console.time('doSomething')
doSomething() // <---- The function you're measuring time for
console.timeEnd('doSomething')
注意:
传递给 time()
和 timeEnd()
方法的字符串必须匹配
(以便计时器如预期般结束)。
console.time()
文档:
totalTime += console.timeEnd('timer')
,并在每个计时器上都这样做。 - vsync使用 new Date().getTime() 方法。
getTime() 方法返回自 1970 年 1 月 1 日午夜以来的毫秒数。
例如:
var start = new Date().getTime();
for (i = 0; i < 50000; ++i) {
// do something
}
var end = new Date().getTime();
var time = end - start;
alert('Execution time: ' + time);
window.performance.now
。请参考 https://dev59.com/3XRC5IYBdhLWcg3wYf8p#15641427。 - Pacerier<script>
var a = performance.now();
alert('do something...');
var b = performance.now();
alert('It took ' + (b - a) + ' ms.');
</script>
适用于以下浏览器:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
console.time
可能 适合你使用,但它是非标准的§:
除了浏览器支持外,此功能是非标准的,不在标准轨道上。不要在面向 Web 的生产站点上使用它:它不会对每个用户都起作用。实现之间可能也存在大的不兼容性,并且行为可能在未来发生变化。
performance.now
似乎有潜力提供更准确的时间,因为它似乎是console.time
的简化版本。请注意,此处的“potential”表示潜在的可能性。
<rant> 另外,千万不要在任何情况下使用Date
,因为它受到“系统时间”的影响。这意味着当用户的系统时间不准确时,我们将会得到无效的结果,例如“负数计时”:
2014年10月,我的系统时钟出了问题,你猜怎么着……我打开Gmail看到所有当天的邮件显示“发送于0分钟前”。而我曾经以为Gmail是由Google的世界级工程师构建的……
(把你的系统时钟调到一年前,然后去Gmail看看,我们都可以开怀大笑。也许有一天我们会为JS Date
设立Hall of Shame。)
Google电子表格的now()
函数也存在这个问题。
Date
。而不是当你想获得the time或测量任何东西时。如果你需要在本地开发机器上获取函数执行时间,你可以使用浏览器的性能分析工具或控制台命令,例如console.time()
和console.timeEnd()
。
所有现代浏览器都内置了JavaScript分析工具。这些分析工具应该会给出最准确的测量结果,因为您不需要修改现有的代码,这可能会影响函数的执行时间。
要对JavaScript进行分析:
或者,在您的开发机器上,您可以使用 console.time()
和 console.timeEnd()
为代码添加仪器。这些函数在Firefox11+、Chrome2+和IE11+中受支持,报告您通过 console.time()
启动/停止的计时器。 time()
接受一个用户定义的计时器名称作为参数,timeEnd()
然后报告自计时器启动以来的执行时间:
function a() {
console.time("mytimer");
... do stuff ...
var dur = console.timeEnd("myTimer"); // NOTE: dur only works in FF
}
请注意,只有Firefox在timeEnd()
调用中返回经过的时间。其他浏览器只是将结果报告给开发者控制台:调用timeEnd()
的返回值为未定义。
如果您想在实际应用中获取函数执行时间,您需要在代码中添加工具。您有几个选项。您可以通过查询new Date().getTime()
来简单保存开始和结束时间:
function a() {
var start = new Date().getTime();
... do stuff ...
var end = new Date().getTime();
var dur = end - start;
}
然而,Date
对象只有毫秒级的分辨率,并且会受到任何操作系统系统时钟更改的影响。在现代浏览器中,有一个更好的选择。window.performance.now()
。 now()
比传统的Date.getTime()
更好,有两个重要的优点:
now()
是一个双精度数字,具有亚毫秒的分辨率,表示自页面导航开始以来的毫秒数。它返回小数部分中的微秒数(例如,值为1000.123是1秒和123微秒)。now()
是单调递增的。这很重要,因为Date.getTime()
可能在后续调用中可能会向前或向后跳跃。值得注意的是,如果更新了操作系统的系统时间(例如,原子钟同步),则Date.getTime()
也会被更新。now()
保证始终单调递增,因此不受操作系统的系统时间影响--它始终是挂钟时间(假设您的挂钟不是原子钟...)。now()
可以用于几乎所有需要new Date().getTime()
,+ new Date
和Date.now()
的地方。例外情况是Date
和now()
时间不能混合使用,因为Date
基于Unix纪元(自1970年以来的毫秒数),而now()
是自页面导航开始以来的毫秒数(因此它比Date
小得多)。now()
的示例:function a() {
var start = window.performance.now();
... do stuff ...
var end = window.performance.now();
var dur = end - start;
}
now()
在Chrome stable、Firefox 15+和IE10中得到支持。此外,还有几个polyfills可用。
在实际环境中测量执行时间的另一种选择是UserTiming。UserTiming的行为类似于console.time()
和console.timeEnd()
,但它利用与now()
相同的高分辨率时间戳(因此获得亚毫秒单调递增时钟),并将时间戳和持续时间保存到PerformanceTimeline中。
UserTiming具有marks(时间戳)和measures(持续时间)的概念。您可以定义任意数量的任何一个,并且它们都会暴露在PerformanceTimeline上。
要保存时间戳,请调用mark(startMarkName)
。要获取自第一个标记以来的持续时间,只需调用measure(measurename, startMarkname)
即可。然后,持续时间将与您的标记一起保存在PerformanceTimeline中。
function a() {
window.performance.mark("start");
... do stuff ...
window.performance.measure("myfunctionduration", "start");
}
// duration is window.performance.getEntriesByName("myfunctionduration", "measure")[0];
UserTiming在IE10+和Chrome25+中可用。此外还有一个polyfill(由我编写)可用。
performance.now
和Date
的细节和样板是它存在的原因。 - hashchange为了获得精确的值,您应该使用性能接口。它受现代版本的Firefox、Chrome、Opera和IE支持。下面是一个示例,说明如何使用它:
var performance = window.performance;
var t0 = performance.now();
doWork();
var t1 = performance.now();
console.log("Call to doWork took " + (t1 - t0) + " milliseconds.")
Date.getTime()
或console.time()
并不适合精确测量执行时间。如果可以接受快速的粗略估计,则可以使用它们。我的意思是说,你可能会比实际时间多出15-60毫秒。
请查看这篇关于JavaScript中测量执行时间的精彩文章。作者还提供了一些有关JavaScript时间准确性的链接,值得一读。
node.js
,而这个答案不需要。巧合的是,你的总积分 1,963
等于我的出生年份! - WinEunuuchs2Unix1,382
对我来说并没有什么特别的意义。达到 1,991
分,给我五个赞 :) - Varvara Kalinina var start = +new Date();
callYourFunctionHere();
var end = +new Date();
var time = end - start;
console.log('total execution time = '+ time + 'ms');
使用 Firebug,启用控制台和 JavaScript。点击“分析”。重新加载页面。再次点击“分析”。查看报告。
console.time()
和console.timeEnd()
。 - julien_cNode.js 中可用 process.hrtime() 方法 - 它返回纳秒级别的值。
let hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)
hrtime[0] * 1000 + hrtime[1] / 1000000
。哈哈,我也更喜欢使用 var hrtime
!:P - cregox这是一个用于计时函数的修饰符。
它将函数包装起来,每次运行时都会计时。
使用方法:
let test = () => { /* does something */ }
test = timed(test) // turns the function into a timed function in one line
test() // run your code as normal, logs 'function test took 1001.900ms'
这是装饰器:
let timed = (f) => (...args) => {
let start = performance.now();
let ret = f(...args);
console.log(`function ${f.name} took ${(performance.now() - start).toFixed(3)}ms`);
return ret;
}
如果您正在使用异步函数,您可以使 timed
成为异步函数,并在 f(...args) 前添加 await
,这样就可以正常运行了。如果要让一个装饰器处理同步和异步函数,则会变得更加复杂。可以仅使用一个变量:
var timer = -performance.now();
// Do something
timer += performance.now();
console.log("Time: " + (timer/1000).toFixed(5) + " sec.")
timer/1000
- 将毫秒转换为秒
.toFixed(5)
- 保留小数点后五位
performance.now()
在 Node 中无法使用。你可以使用new Date().getTime()
来代替,在 Node 中它能正常工作。 - Ryan WalkerDate.now()
,在node中也可以工作。 - f278f1b2