这种方式更优雅,秒表计时!

阅读原文: 这种方式更优雅,秒表计时!

秒表计时

你有看过学校百米赛跑时,体育老师手里的秒表吗?老师是怎么记八个跑道中的学生跑了多少时间的呢?

今天我们要做的就是实现老师手中的秒表,但是我们计算机无法真正同时跑n个任务,我们只能一个跑完跑下一个。

许多人统计用时会向下面这样,但方式并不优雅!现在我们来一起实现一个秒表让统计更加优雅吧。

public class Test{

    public static void main(String[] args) {
       long s =  System.currentTimeMillis();
       // 算法1
       // do something
       long s1 = System.currentTimeMillis() - s;
       System.out.println("第一段代码执行时间:"+s1);
       // 算法2
       // do something
       long s2 = System.currentTimeMillis() - s1;
       System.out.println("第二段代码执行时间:"+s2);
    }
}

看完这段代码就问你,烦不烦?

问题所在

那么我们烦在哪里?

  1. 每次都要获取获取时间代码
  2. 每次都要主动打印
  3. 无关紧要的计时打印代码占据了视线
  4. 如果n段代码统计对比,需要人工对比或硬编码对比

好了,问题知道了,来想想解决方案吧。

解决方案

  1. 封装一个方法代替每次时间相减的代替
  2. 将打印最后统一输出
  3. 统计每段用时,排序或对比

开始实现我们的秒表类 StopWatch 吧

  • 每段计时任务要有一个唯一标识和一个最终用时
  • 需要一个容器来存储每个计时任务
  • 需要记录总时长和任务数量

具体实现

  • 每个计时任务类
public class Task {
        private String name;
        private long timeMillis;

        public Task(String name, long timeMillis) {
            this.name = name;
            this.timeMillis = timeMillis;
        }
}
  • 秒表类
public class StopWatch {
    /*
     * 存储执行或的任务容器
     */
    private List<Task> tasks = new ArrayList<>();  
    /*
     * 当前执行的任务
     */
    private String currentName; 
    /*
     * 当前任务的开始时间
     */
    private long startMillis;   
    /*
     * 总用时
     */
    private long totalMillis;  

    public StopWatch() {
    }
    /**
     * 开始任务
     * @param taskName 任务名
     */
    public void start(String taskName) {
        if (currentName != null){
            stop();
        }
        this.currentName = taskName;
        this.startMillis = System.currentTimeMillis();
    }
    /**
     * 停止任务
     */
    public void stop() {
        if (null == currentName) {
            throw new RuntimeException("");
        }
        long spend = System.currentTimeMillis() - startMillis;
        totalMillis += spend;
        Task task = new Task(currentName, spend);
        tasks.add(task);
    }

    public int size() {
        return tasks.size();
    }

    /**
     * 打印结果
     */
    public void print() {
        if (currentName != null){
            stop();
        }
        StringBuilder s = new StringBuilder();
        s.append("任务名称\t用时\t占比\t\n");
        for (Task task : tasks) {
            s.append(task.getName() + "\t");
            s.append(task.getTimeMillis() + "\t");
            double l = task.getTimeMillis() / (double)totalMillis;
            s.append(String.format("%.2f",l)  + "\t\n");
        }
        s.append("总用时:" + totalMillis);
        System.out.println(s.toString());
    }
}
  • 那么看看现在如何做
public class Test {

    public static void main(String[] args){
        StopWatch stopWatch = new StopWatch();

        stopWatch.start("任务1");
        TimeUnit.SECONDS.sleep(1);

        stopWatch.start("任务2");
        TimeUnit.SECONDS.sleep(2);

        stopWatch.print();
    }
}

此时我漏出了满意的笑容![表情]

最后告诉你个消息: Apache commons , Spring core , Google guava 都给我们实现了稍有不同的StopWatch类!

如果你跟随我一块实现了StopWatch,那去看看这三个提供的,应该 so easy!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274