JDK1.8 - lamda 接口耗时统计

JDK1.8 - lamda 接口耗时统计

  • 前言
  • 实现方式
    • 修改前耗时统计方法
    • 修改后耗时统计方法
  • 代码演示

前言

由于平时开发测试中,经常需要查看目标方法的耗时情况,每次都要在目标方法前后写相同的时间计算代码,于是呢,正好利用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;
    }
}

代码演示

  1. 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
  1. 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
  1. 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
  1. 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

大家如果有什么疑问,欢迎评论留言!别忘了收藏关注~

你可能感兴趣的:(#,随手记)