StopWatch 以秒为单位的 prettyPrint()

2,474 阅读1分钟

前言

StopWatch 的 prettyPrint 方法可以输出任务执行的统计信息,但是默认的时间单位是到纳秒的,可读性不是很好,

image.png

可以重写 StopWatch 的 prettyPrint 方法,使其展示的时间单位为秒,同时调整百分百的格式,保留两位小数,效果如下:

image.png

实现方法

增加一个工具方法,传入 StopWatch 对象,具体代码如下:

private String prettyPrintBySecond(StopWatch stopWatch) {
    StopWatch.TaskInfo[] taskInfos = stopWatch.getTaskInfo();
    StringBuilder sb = new StringBuilder();
    sb.append('\n');
    sb.append("StopWatch '").append(stopWatch.getId()).append("': running time = ").append(stopWatch.getTotalTimeSeconds()).append(" s");
    sb.append('\n');
    if (taskInfos.length < 1) {
        sb.append("No task info kept");
    } else {
        sb.append("---------------------------------------------\n");
        sb.append("s         %     Task name\n");
        sb.append("---------------------------------------------\n");
        NumberFormat nf = NumberFormat.getNumberInstance();
        nf.setMinimumFractionDigits(3);
        nf.setGroupingUsed(false);
        NumberFormat pf = NumberFormat.getPercentInstance();
        pf.setMinimumIntegerDigits(2);
        pf.setMinimumFractionDigits(2);
        pf.setGroupingUsed(false);
        for (StopWatch.TaskInfo task : taskInfos) {
            sb.append(nf.format(task.getTimeSeconds())).append("  ");
            sb.append(pf.format((double) task.getTimeNanos() / stopWatch.getTotalTimeNanos())).append("  ");
            sb.append(task.getTaskName()).append("\n");
        }
    }
    return sb.toString();
}

其它

NumberFormat 方法的一些说明:

setMinimumFractionDigits 设置小数的最小位数,不足则在后面补零

setMinimumIntegerDigits 设置整数的最小位数,不在则在签名补零