由于平时开发测试中,经常需要查看目标方法的耗时情况,每次都要在目标方法前后写相同的时间计算代码,于是呢,正好利用1.8的新特性 lamda 实现一个常用的util。
顺便记录分享一下。
先来看看常见的统计接口方法执行耗时的代码:
@Slf4j
public class TestTimer {
public static void task1(){
try {
log.info("执行任务开始..");
Thread.sleep(1000);
log.info("执行任务结束..");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void test1(){
long start = System.currentTimeMillis();
task1();
long end = System.currentTimeMillis();
log.info("线程:{}, 运行时间:{} ms"
, Thread.currentThread().getName(), (end - start));
}
}
执行结果:
[INFO ][20:56:05 TestTimer:16 line] 执行任务开始..
[INFO ][20:56:06 TestTimer:18 line] 执行任务结束..
[INFO ][20:56:06 TestTimer:28 line] 线程:main, 运行时间:1002 ms
定义一个工具类 HandleTimer
, 用于统计方法执行耗时。
这里重载了四种形式的耗时统计:
import lombok.extern.slf4j.Slf4j;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* @Date: 2019/12/28 18:36
* @Author: swotXu
*/
@Slf4j
public class HandleTimer {
/**
* 获取方法执行时间
* -- 执行任务
* @param handle 监听的方法
*/
public static void runTime(Runnable handle){
long start = System.currentTimeMillis();
handle.run();
long end = System.currentTimeMillis();
log.info("线程:{}, 运行时间:{} ms"
, Thread.currentThread().getName(), (end - start));
}
/**
* 获取方法执行时间
* -- 消费者接口
* @param handle 监听的方法
* @param t 监听的方法所需参数
* @param 参数类型
*/
public static <T> void runTime(Consumer<T> handle, T t){
long start = System.currentTimeMillis();
handle.accept(t);
long end = System.currentTimeMillis();
log.info("线程:{}, 计算:{}, 运行时间:{} ms"
, Thread.currentThread().getName(), t, (end - start));
}
/**
* 获取方法执行时间
* -- 生产者接口
* @param handle 监听的方法
* @param 返回值类型
*/
public static <R> R runTime(Supplier<R> handle){
long start = System.currentTimeMillis();
R r = handle.get();
long end = System.currentTimeMillis();
log.info("线程:{}, 结果:{}, 运行时间:{} ms"
, Thread.currentThread().getName(), r, (end - start));
return r;
}
/**
* 获取方法执行时间
* -- 转换接口
* @param handle 监听的方法
* @param t 监听的方法所需参数
* @param 参数类型
* @param 返回值类型
*/
public static <T, R> R runTime(Function<T, R> handle, T t){
long start = System.currentTimeMillis();
R apply = handle.apply(t);
long end = System.currentTimeMillis();
log.info("线程:{}, 计算:{} = {}, 运行时间:{} ms"
, Thread.currentThread().getName(), t, apply, (end - start));
return apply;
}
}
void runTime(Runnable handle)
public static void task2(){
try {
log.info("执行任务开始..");
Thread.sleep(1000);
log.info("执行任务结束..");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void test2(){
HandleTimer.runTime(TestTimer::task2);
}
结果:
[INFO ][22:32:51 TestTimer:16 line] 执行任务开始..
[INFO ][22:32:52 TestTimer:18 line] 执行任务结束..
[INFO ][22:32:52 HandleTimer:26 line] 线程:main, 运行时间:1006 ms
void runTime(Consumer handle, T t)
public static void task3(int i){
try {
log.info("执行任务开始.. i: {}", i);
Thread.sleep(1000);
log.info("执行任务结束..");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void test3(){
HandleTimer.runTime(TestTimer::task3, 666);
}
结果:
[INFO ][22:37:11 TestTimer:48 line] 执行任务开始.. i: 666
[INFO ][22:37:12 TestTimer:50 line] 执行任务结束..
[INFO ][22:37:12 HandleTimer:40 line] 线程:main, 计算:666, 运行时间:1009 ms
R runTime(Supplier handle)
public static int task4(){
try {
log.info("执行任务开始..");
Thread.sleep(1000);
log.info("执行任务结束..");
} catch (InterruptedException e) {
e.printStackTrace();
}
return 666;
}
@Test
public void test4(){
Integer result = HandleTimer.runTime(TestTimer::task4);
}
结果:
[INFO ][22:39:12 TestTimer:62 line] 执行任务开始..
[INFO ][22:39:13 TestTimer:64 line] 执行任务结束..
[INFO ][22:39:13 HandleTimer:53 line] 线程:main, 结果:666, 运行时间:1004 ms
R runTime(Function handle, T t)
public static String task5(int t){
try {
log.info("执行任务开始.. t: {}", t);
Thread.sleep(1000);
log.info("执行任务结束..");
} catch (InterruptedException e) {
e.printStackTrace();
}
return "233";
}
@Test
public void test5(){
String result = HandleTimer.runTime(TestTimer::task5, 666);
}
结果:
[INFO ][22:41:41 TestTimer:77 line] 执行任务开始.. t: 666
[INFO ][22:41:42 TestTimer:79 line] 执行任务结束..
[INFO ][22:41:42 HandleTimer:69 line] 线程:main, 计算:666 = 233, 运行时间:1005 ms
大家如果有什么疑问,欢迎评论留言!别忘了收藏关注~