StopWatch的使用

简单总结一句,Spring提供的计时器StopWatch对于秒、毫秒为单位方便计时的程序,尤其是单线程、顺序执行程序的时间特性的统计输出支持比较好。也就是说假如我们手里面有几个在顺序上前后执行的几个任务,而且我们比较关心几个任务分别执行的时间占用状况,希望能够形成一个不太复杂的日志输出,StopWatch提供了这样的功能。而且Spring的StopWatch基本上也就是仅仅为了这样的功能而实现。
下面是工作当中具体实现的一个实例(代码依赖其他部分,所以此处只是展现一个实际例子)
 
 public void work() {
        LOG.info("数据抓取任务");
        StopWatch clock = new StopWatch();
        clock.start("初始化注入数据");
        duomiDataInitService.initJsonData();// 初始化注入数据
        clock.stop();

        clock.start("更新热门歌手");
        entertainerService.updateHotSinger();// 更新热门歌手
        LOG.info("更新热门歌手结束");
        clock.stop();
        clock.start("更新歌手专辑");
        singerAlbumService.updateSingerAlbum();// 更新歌手专辑
        LOG.info("更新歌手专辑结束");
        clock.stop();
        clock.start("更新热门专辑");
        hotAlbumService.updateHotAlbum();// 更新热门专辑
        LOG.info("更新热门专辑结束");
        clock.stop();
        clock.start("更新新曲推荐");
        newRecSongService.updateNewRecSong();// 更新 新曲推荐
        LOG.info("更新新曲推荐结束");
        clock.stop();

        clock.start("更新最新歌单");
        playListService.updateNewPlayList();// 更新 最新歌单
        LOG.info("更新最新歌单结束");
        clock.stop();
        clock.start("更新热门歌单");
        playListService.updateHotPlayList();// 更新热门歌单
        LOG.info("更新热门歌单结束");
        clock.stop();
        clock.start("更新推荐歌单");
        playListService.updateRmdPlayList();// 更新推荐歌单
        LOG.info("更新推荐歌单结束");
        clock.stop();
        clock.start("更新所有榜单");
        rankListService.updateAllRankList();// 更新所有榜单
        LOG.info("更新所有榜单结束");
        clock.stop();
        clock.start("更新推荐榜单");
        rankListService.updateRmdRankList();// 更新推荐榜单
        LOG.info("更新推荐榜单结束");

        clock.stop();
        clock.start("更新MV相关");
        try {
            mvService.updateMvConcert();
            mvService.updateMvAppreciate();
            mvService.updateMvHd();
            mvService.updateMvRmd();
            mvService.updateTreePosters();
        } catch (JSONException e) {
            e.printStackTrace();
            LOG.error(e);
        }
        clock.stop();

        clock.start("表更新消息发送");
        try {
            informApiService.sendMessage();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            LOG.error(e);
        } catch (IOException e) {
            e.printStackTrace();
            LOG.error(e);
        }
        clock.stop();

        LOG.info("数据抓取任务全部执行结束");
        LOG.info(clock.prettyPrint());
        // clock.stop();
        double seconds = clock.getTotalTimeSeconds();
        LOG.info("共耗费秒数=" + seconds);

    }
工作的一个总任务性质属于抓取第三方提供的音乐相关的数据,包括热门歌手、歌手专辑、热门专辑、新曲推荐等N个任务,每个任务的逻辑复杂度不同,所以需要关心每个任务执行的时间,然后再考虑做一些优化就能够知道程序的优化效果。这里面总任务执行之前new 一个StopWatch然后将这个实例start("任务名称"),一个任务执行完毕则执行stop(),下一个任务开启前start(“下一任务名称‘)。这样最后可以调用 StopWatch.prettyPrint()方法返回一个小型的报表,输出的信息如下
-----------------------------------------
ms     %     Task name
-----------------------------------------
05907  001%  初始化注入数据
02322  000%  更新热门歌手
38966  004%  更新歌手专辑
09741  001%  更新热门专辑
32606  004%  更新新曲推荐
51684  006%  更新最新歌单
59119  006%  更新热门歌单
48566  005%  更新推荐歌单
475113  052%  更新所有榜单
185599  020%  更新推荐榜单
01667  000%  更新MV相关
00000  000%  表更新消息发送
>

为方便学习,下面笔者写一个可以直接执行的StopWatch执行的代码实例,实例依赖Spring的核心jar包

 
  1. import org.springframework.util.StopWatch;

  2.  
  3. public class StopWatchDemo {

  4.  
  5. /**

  6. * @param args

  7. * @throws InterruptedException

  8. */

  9. public static void main(String[] args) throws InterruptedException {

  10. // TODO Auto-generated method stub

  11. StopWatch clock = new StopWatch();

  12. clock.start("TaskOneName");

  13. Thread.sleep(1000 * 3);// 任务一模拟休眠3秒钟

  14. clock.stop();

  15. clock.start("TaskTwoName");

  16. Thread.sleep(1000 * 10);// 任务一模拟休眠10秒钟

  17. clock.stop();

  18. clock.start("TaskThreeName");

  19. Thread.sleep(1000 * 10);// 任务一模拟休眠10秒钟

  20. clock.stop();

  21.  
  22. System.out.println(clock.prettyPrint());

  23. }

  24.  
  25. }

  26.  


 

控制台输出如下:
StopWatch '': running time (millis) = 22926
-----------------------------------------
ms     %     Task name
-----------------------------------------
02990  013%  TaskOneName
09968  043%  TaskTwoName
09968  043%  TaskThreeName

猜你喜欢

转载自blog.csdn.net/u012501054/article/details/82628542