您的位置:首页 > 编程语言 > Java开发

spring stopwatch

2016-04-22 18:27 573 查看
spring 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包

import org.springframework.util.StopWatch;

public class StopWatchDemo {

/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
StopWatch clock = new StopWatch();
clock.start("TaskOneName");
Thread.sleep(1000 * 3);// 任务一模拟休眠3秒钟
clock.stop();
clock.start("TaskTwoName");
Thread.sleep(1000 * 10);// 任务一模拟休眠10秒钟
clock.stop();
clock.start("TaskThreeName");
Thread.sleep(1000 * 10);// 任务一模拟休眠10秒钟
clock.stop();

System.out.println(clock.prettyPrint());
}

}

控制台输出如下:
StopWatch '': running time (millis) = 22926
-----------------------------------------
ms % Task name
-----------------------------------------
02990 013% TaskOneName
09968 043% TaskTwoName
09968 043% TaskThreeName
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: