我需要以毫秒为单位获得执行时间.
我最初在2008年问过这个问题.然后,接受的答案是使用新的Date().getTime()但是,我们现在都同意使用标准的performance.now() API更合适.因此,我正在改变对此问题的接受答案.
vsync.. 1569
var t0 = performance.now(); doSomething(); // <---- The function you're measuring time for var t1 = performance.now(); console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.");
NodeJs
:需要导入performance
该类
console.time('someFunction'); someFunction(); // Whatever is timed goes between the two "console.time" console.timeEnd('someFunction');
注意:
传递给time()
和timeEnd()
方法的字符串必须匹配
(使计时器按预期完成).
console.time()
单证:
有关的NodeJS文档
MDN(客户端)文档
它现在也得到Chrome开发者工具的支持. (23认同)
是的,你可以做`totalTime + = console.timeEnd('timer')'并为每个计时器做 (6认同)
你不需要在这两个语句之间执行函数吗?您现在可以测量定义它所需的时间,而不是执行它.如我错了请纠正我... (5认同)
这是目前根据我的理解收集准确时间的最佳方式. (3认同)
链接到有关此功能的MDN文章:https://developer.mozilla.org/en-US/docs/DOM/console.time (2认同)
顺便说一句,如果您在Chrome中工作 - 请确保您没有无意中设置了错误的日志消息过滤器.timeEnd()将消息记录为"Debug"控制台消息.送我一点野鹅追逐...... (2认同)
nodeJS中的Console.timeEnd返回`undefined`. (2认同)
Owen.. 615
使用新的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);
计时不准确,因为日期不适用于此功能.我会在这里大胆说你应该使用vsync的例子,如果你想要准确的计时.虽然它只适用于Chrome和Firefox ATM. (54认同)
@AshBlue,我们应该使用`window.performance.now`.请参见http://stackoverflow.com/a/15641427/632951 (29认同)
请注意,您可以用+ new Date()替换getTime()调用:var start = + new Date(); //做东西警报("执行时间:"+(+新日期()) - 开始); (9认同)
请注意,getMilliseconds()为您提供当前秒的毫秒分数.如果用getMilliseconds()替换getTime(),如果跨越一秒,则会得到负面结果. (9认同)
按今天的标准,vsync的答案要正确得多,使用Date()可能会导致显示非常错误的结果,特别是在Windows平台上,结果可能会被四舍五入并覆盖到最近的15ms边界,从而产生奇怪的东西,如微小代码位上的0ms时序. (6认同)
Pacerier.. 399
用途performance.now()
:
它适用于:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
等等
console.time
对你来说可能是可行的,但它是非标准的§:
此功能是非标准功能,不符合标准.不要在面向Web的生产站点上使用它:它不适用于每个用户.有也可能实现之间不兼容大和行为可能会改变未来.
除了浏览器支持,performance.now
似乎有可能提供更准确的时间,因为它似乎是简单的版本console.time
.
<咆哮>此外,永远不要使用Date
了什么,因为它受到在"系统时间"的变化.这意味着当用户没有准确的系统时间时,我们将得到无效结果 - 如"负时间" -
2014年10月,我的系统时钟乱了,猜猜是什么 ....我打开了Gmail,看到了我所有的一天的电子邮件" 0分钟前发送".我认为Gmail应该由Google的世界级工程师构建.......
(将你的系统时钟设置为一年前,然后转到Gmail,这样我们就可以大笑了.也许有一天我们会为JS 提供一个耻辱大厅Date
.)
Google Spreadsheet的now()
功能也受此问题的影响.
您将要使用的唯一时间Date
是您希望向用户显示其系统时钟时间.不是当你想要得到的时间或测量任何东西.
var t0 = performance.now(); doSomething(); // <---- The function you're measuring time for var t1 = performance.now(); console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.");
NodeJs
:需要导入performance
该类
console.time('someFunction'); someFunction(); // Whatever is timed goes between the two "console.time" console.timeEnd('someFunction');
注意:
传递给time()
和timeEnd()
方法的字符串必须匹配
(使计时器按预期完成).
console.time()
单证:
有关的NodeJS文档
MDN(客户端)文档
使用新的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);
用途performance.now()
:
它适用于:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
等等
console.time
对你来说可能是可行的,但它是非标准的§:
此功能是非标准功能,不符合标准.不要在面向Web的生产站点上使用它:它不适用于每个用户.有也可能实现之间不兼容大和行为可能会改变未来.
除了浏览器支持,performance.now
似乎有可能提供更准确的时间,因为它似乎是简单的版本console.time
.
<咆哮>此外,永远不要使用Date
了什么,因为它受到在"系统时间"的变化.这意味着当用户没有准确的系统时间时,我们将得到无效结果 - 如"负时间" -
2014年10月,我的系统时钟乱了,猜猜是什么 ....我打开了Gmail,看到了我所有的一天的电子邮件" 0分钟前发送".我认为Gmail应该由Google的世界级工程师构建.......
(将你的系统时钟设置为一年前,然后转到Gmail,这样我们就可以大笑了.也许有一天我们会为JS 提供一个耻辱大厅Date
.)
Google Spreadsheet的now()
功能也受此问题的影响.
您将要使用的唯一时间Date
是您希望向用户显示其系统时钟时间.不是当你想要得到的时间或测量任何东西.
如果需要在本地开发计算机上获得函数执行时间,可以使用浏览器的分析工具或控制台命令,如console.time()
和console.timeEnd()
.
所有现代浏览器都内置了JavaScript分析器.这些分析器应该提供最准确的测量,因为您不必修改现有代码,这可能会影响函数的执行时间.
要分析您的JavaScript:
在Chrome中,按F12并选择" 配置文件"选项卡,然后选择" 收集JavaScript CPU配置文件".
在Firefox中,安装/打开Firebug,然后单击" 配置文件"按钮.
在IE 9+中,按F12,单击脚本或Profiler(取决于您的IE版本).
或者,在您的开发机器上,您可以使用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()
undefined.
如果您想在野外获得函数执行时间,则必须检测代码.你有几个选择.您可以通过查询来简单地保存开始和结束时间new Date().getTime()
:
function a() { var start = new Date().getTime(); ... do stuff ... var end = new Date().getTime(); var dur = end - start; }
但是,该Date
对象仅具有毫秒级的分辨率,并且会受到任何OS系统时钟更改的影响.在现代浏览器中,有一个更好的选择.
更好的选择是使用高分辨率时间,也就是说window.performance.now()
. 在两个重要方面now()
比传统Date.getTime()
方式更好:
now()
是一个亚毫秒分辨率的双精度,表示自页面导航开始以来的毫秒数.它返回小数中的微秒数(例如,1000.123的值是1秒和123微秒).
now()
是单调增加的.这很重要,因为Date.getTime()
可能会在后续呼叫中向前跳甚至向后跳.值得注意的是,如果OS的系统时间更新(例如原子钟同步),Date.getTime()
也会更新. now()
保证总是单调增加,因此它不受操作系统的系统时间的影响 - 它将始终是挂钟时间(假设你的挂钟不是原子的......).
now()
几乎可以在任何地方使用new Date().getTime()
,+ new Date
和T 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支持.还有几种填充剂.
用于测量野外执行时间的另一个选项是UserTiming.UserTiming的行为类似于console.time()
和console.timeEnd()
,但它使用相同的高分辨率时间戳now()
(因此您得到一个亚毫秒单调增加的时钟),并将时间戳和持续时间保存到PerformanceTimeline.
UserTiming具有标记(时间戳)和度量(持续时间)的概念.您可以根据需要定义任意数量,并在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接口.现代版本的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时间准确性的链接,值得一读.
使用Firebug,启用Console和Javascript.点击个人资料 刷新.再次单击配置文件 查看报告.
process.hrtime()在Node.js中可用- 它返回一个以纳秒为单位的值
var hrTime = process.hrtime() console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)
var StopWatch = function (performance) { this.startTime = 0; this.stopTime = 0; this.running = false; this.performance = performance === false ? false : !!window.performance; }; StopWatch.prototype.currentTime = function () { return this.performance ? window.performance.now() : new Date().getTime(); }; StopWatch.prototype.start = function () { this.startTime = this.currentTime(); this.running = true; }; StopWatch.prototype.stop = function () { this.stopTime = this.currentTime(); this.running = false; }; StopWatch.prototype.getElapsedMilliseconds = function () { if (this.running) { this.stopTime = this.currentTime(); } return this.stopTime - this.startTime; }; StopWatch.prototype.getElapsedSeconds = function () { return this.getElapsedMilliseconds() / 1000; }; StopWatch.prototype.printElapsed = function (name) { var currentName = name || 'Elapsed:'; console.log(currentName, '[' + this.getElapsedMilliseconds() + 'ms]', '[' + this.getElapsedSeconds() + 's]'); };
基准
var stopwatch = new StopWatch(); stopwatch.start(); for (var index = 0; index < 100; index++) { stopwatch.printElapsed('Instance[' + index + ']'); } stopwatch.stop(); stopwatch.printElapsed();
产量
Instance[0] [0ms] [0s] Instance[1] [2.999999967869371ms] [0.002999999967869371s] Instance[2] [2.999999967869371ms] [0.002999999967869371s] /* ... */ Instance[99] [10.999999998603016ms] [0.010999999998603016s] Elapsed: [10.999999998603016ms] [0.010999999998603016s]
performance.now()是可选的 - 只需将false传递给StopWatch构造函数.
为了进一步扩展vsync的代码以使得能够在NodeJS中返回timeEnd作为值,使用这一小段代码.
console.timeEndValue = function(label) { // Add console.timeEndValue, to add a return value var time = this._times[label]; if (!time) { throw new Error('No such label: ' + label); } var duration = Date.now() - time; return duration; };
现在使用代码如下:
console.time('someFunction timer'); someFunction(); var executionTime = console.timeEndValue('someFunction timer'); console.log("The execution time is " + executionTime);
这为您提供了更多可能性.您可以存储执行时间以用于更多目的,例如在方程式中使用它,或存储在数据库中,通过websockets发送到远程客户端,在网页上提供服务等.
你也可以在这里使用add运算符
var start = +new Date(); callYourFunctionHere(); var end = +new Date(); var time = end - start; console.log('total execution time = '+ time + 'ms');
只能使用一个变量:
var timer = -performance.now(); // Do something timer += performance.now(); console.log("Time: " + (timer/1000).toFixed(5) + " sec.")
timer/1000
-将毫秒转换为秒
.toFixed(5)
-修剪多余的数字
由于console.time
并且performance.now
在某些主流浏览器(即IE10)中不受支持,我创建了一个利用最佳可用方法的超薄实用程序.但是,它缺少错误处理的错误处理(调用End()
未初始化的计时器).
使用它并根据需要进行改进.
Performance: { Timer: {}, Start: function (name) { if (console && console.time) { console.time(name); } else if (window.performance.now) { this.Timer[name] = window.performance.now(); } else { this.Timer[name] = new Date().getTime(); } }, End: function (name) { if (console && console.time) { console.timeEnd(name); } else { var result; if (window.performance.now) { result = window.performance.now() - this.Timer[name]; } else { result = new Date().getTime() - this.Timer[name]; } console.log(name + ": " + result); } } }
它可能会帮助你.
var t0 = date.now();
doSomething();
var t1 = date.now();
console.log("Call to doSomething took approximate" + (t1 - t0)/1000 + " seconds.")