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

Spring计时器StopWatch的使用

2014-04-02 12:13 204 查看
简单总结一句,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: