在一些业务或调测中,通常需要对某些函数调用所耗费的时间进行统计或输出日志等,本人写了个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 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/guoli_NIC/article/details/106268340