在一些业务或调测中,通常需要对某些函数调用所耗费的时间进行统计或输出日志等,本人写了个TIME工具类,实现简单的JS耗时统计。
直接上代码:
Date扩展,这段代码来自网络,出处不详,如有引用不当,请指出本人及时更正:
// 这段代码来自网络,出处不详,如有引用不当,请指出本人及时更正
/**
* 对Date的扩展,将 Date 转化为指定格式的String
* 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
* 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
* 例子:
* (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
* (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
*/
Date.prototype.format = function(fmt) {
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
实现TIME类:
/**
* 时间操作相关
*/
class TIME {
constructor() {
// 存放调用start时的开始日期
this.start_date = new Date();
// 存放调用结束时的日期
this.end_date = null;
}
/**
* 开始统计时间
* @returns {*} 返回开始统计时的一些参数 {start_date: Date, stop_date: Date, date_str: 'xxx', pass_time: xxx}
*/
start() {
// 重置开始日期 和 结束时间
if (BASE.isNotNull(this.end_date)) {
this.end_date = null;
}
if (BASE.isNotNull(this.start_date)) {
this.start_date = null;
}
this.start_date = new Date();
return {
start_date: this.start_date, // 开始日期时间
stop_date: this.stop_date, // 停止日期时间(未结束时为null)
date_str: this.dateFormat(this.start_date), // 开始日期时间字符串(格式为yyyy-MM-dd hh:mm:ss.S)
pass_time: this.getPassTimeBetween(this.start_date, this.stop_date), // 统计耗费时间(单位毫秒)
};
}
/**
* 停止统计时间
* @returns {*} 返回停止统计时的一些参数 {start_date: Date, stop_date: Date, date_str: 'xxx', pass_time: xxx}
*/
stop() {
var result = null;
if (BASE.isNotNull(this.start_date)) {
this.stop_date = new Date();
result = {
start_date: this.start_date, // 开始日期时间
stop_date: this.stop_date, // 停止日期时间(未结束时为null)
date_str: this.dateFormat(this.stop_date), // 开始日期时间字符串(格式为yyyy-MM-dd hh:mm:ss.S)
pass_time: this.getPassTimeBetween(this.start_date, this.stop_date), // 统计耗费时间(单位毫秒)
};
this.start_date = null;
this.stop_date = null;
}
return result;
}
/**
* 日期格式化
* @param {Date} date 日期
* @param {string} format 格式,如:"yyyy-MM-dd hh:mm:ss.S"
* @returns {string} 返回格式化后的时间字符串
*/
dateFormat(date, format) {
return TIME.dateFormat(date, format);
}
/**
* 获取两个日期之间的时间间隔(单位为毫秒)
* @param {Date} startTime 开始日期
* @param {Date} endTime 结束日期
*/
getPassTimeBetween(startTime, endTime) {
return TIME.getPassTimeBetween(startTime, endTime);
}
/**
* 日期格式化
* @param {Date} date 日期
* @param {string} format 格式,如:"yyyy-MM-dd hh:mm:ss.S"
* @returns {string} 返回格式化后的时间字符串
*/
static dateFormat(date, format) {
if (BASE.isNotNull(date)) {
if (!BASE.isNotEmpty(format)) {
format = "yyyy-MM-dd hh:mm:ss.S";
}
return date.format(format);
}
return null;
}
/**
* 获取两个日期之间的时间间隔(单位为毫秒)
* @param {Date} startTime 开始日期
* @param {Date} endTime 结束日期
*/
static getPassTimeBetween(startTime, endTime) {
let passTime = 0;
if (BASE.isNotNull(startTime) && BASE.isNotNull(endTime)) {
passTime = endTime.getTime() - startTime.getTime();
if (passTime < 0) {
passTime = startTime.getTime() - endTime.getTime();
}
}
return passTime;
}
};
如何使用呢?
/**
* 主运行逻辑
* @return {boolean} 返回运行结果
*/
run_main_logic: function() {
// 本次处理的开始时间(用于处理完成后统计时间,打印日志)
let time = new TIME();
let start_time = time.start();
console.log('开始处理: ' + start_time.date_str);
// 其他逻辑处理
//
// 统计本次处理的耗时(打印日志)
let stop_time = time.stop();
console.log('处理完成: ' + stop_time.date_str + ', 耗时: ' + stop_time.pass_time + '毫秒');
return true;
}
// 主运行逻辑
run_main_logic();
注:本文中涉及到的BASE,请看阅本人另一篇文章:JS基础工具类——BASE
版权声明:本文为guoli_NIC原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。