成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

盤點多種方法耗時統計的實操解法

開發 前端
在應用開發里,精準把控方法執行耗時,對優化系統性能、提升用戶體驗意義重大。下面將介紹幾種不同的方法耗時統計方式,每種都有其獨特的適用場景。

前言

在應用開發里,精準把控方法執行耗時,對優化系統性能、提升用戶體驗意義重大。下面將介紹幾種不同的方法耗時統計方式,每種都有其獨特的適用場景。

System.currentTimeMillis ()

在方法內借助System.currentTimeMillis()記錄起始和結束時間,進而算出方法執行耗時。這種方式簡單直接,無需引入額外依賴。

@Service
public class BookService {
    public Book getBookById(Long id) {
        long startTime = System.currentTimeMillis();

        // 模擬從數據庫獲取書籍信息的業務邏輯
        Book book = bookRepository.findById(id).orElse(null);

        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime;
        System.out.println("getBookById方法耗時:" + elapsedTime + "ms");

        return book;
    }
}

利用 StopWatch

@Service
public class UserService {
    public User findUserById(Long id) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        // 模擬業務邏輯,這里從數據庫查詢用戶信息
        User user = userRepository.findById(id).orElse(null);

        stopWatch.stop();
        System.out.println("findUserById方法執行耗時:" + stopWatch.getTotalTimeMillis() + "毫秒");

        return user;
    }
}

使用AOP實現全局方法

在 項目中配置aop依賴后,就能利用它進行方法耗時統計

@Aspect
@Component
public class MethodTimeAspect {
    @Around("execution(* com.example.demo.service.*.*(..))")
    public Object measureTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime;
        String methodName = joinPoint.getSignature().getName();
        System.out.println("方法[" + methodName + "]耗時:" + elapsedTime + "ms");
        return result;
    }
}

利用 HandlerInterceptor 統計

Spring的HandlerInterceptor可用于監控Controller層接口的耗時情況

public class ControllerTimeInterceptor implements HandlerInterceptor {
    private ThreadLocal<Long> startTime = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        startTime.set(System.currentTimeMillis());
        returntrue;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime.get();
        String uri = request.getRequestURI();
        System.out.println("接口[" + uri + "]耗時:" + elapsedTime + "ms");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 可在此處進行資源清理等操作
        startTime.remove();
    }
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new ControllerTimeInterceptor())
               .addPathPatterns("/api/**");
    }
}

基于 Servlet Filter 統計

通過創建Servlet Filter,可記錄HTTP請求的整體耗時

@WebFilter("/*")
public class RequestTimeFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        chain.doFilter(request, response);
        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime;
        String requestUri = ((HttpServletRequest) request).getRequestURI();
        System.out.println("請求[" + requestUri + "]耗時:" + elapsedTime + "ms");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void destroy() {}
}

使用ServletRequestHandledEvent統計

在Spring框架中,監控接口請求的性能可以通過ServletRequestHandledEvent事件實現

@Component
public class TimeCountListener implements ApplicationListener<ServletRequestHandledEvent> {

  @Override
  public void onApplicationEvent(ServletRequestHandledEvent event) {
    Throwable failureCause = event.getFailureCause();
    if (failureCause != null) {
      System.err.printf("錯誤原因: %s%n", failureCause.getMessage());
    }
    System.err.println("========================================");
    System.err.printf("請求客戶端地址:%s\n請求URL: %s\n請求Method: %s\n請求耗時: %d毫秒%n", 
        event.getClientAddress(),
        event.getRequestUrl(), 
        event.getMethod(), 
        event.getProcessingTimeMillis());
    System.err.println("========================================");
  }
}

實際開發時,需根據項目規模、業務場景、性能需求等因素綜合考慮,選擇最合適的方法,從而高效地進行性能優化。

責任編輯:武曉燕 來源: 一安未來
相關推薦

2024-01-12 08:40:56

Python計算質數質數

2009-10-20 15:39:20

Linux壓縮

2009-07-03 13:22:37

調用Servlet

2010-05-14 18:16:44

MySQL統計函數

2009-12-01 18:03:56

Linux版本

2009-05-18 17:16:50

2010-08-16 16:39:48

DIV內容居中

2010-04-12 09:36:29

Oacle merge

2022-07-05 15:15:11

Python日期命令

2010-04-19 16:17:39

防火墻網絡管理服務器安全

2019-03-27 14:41:41

Python數據庫Windows

2010-05-18 12:24:16

MySQL binlo

2010-04-09 10:13:13

Oracle數據字典

2010-04-15 14:18:30

Oracle創建

2010-05-10 17:00:53

Oracle死鎖進程

2020-09-14 14:18:05

Vue和React

2009-03-17 00:52:52

2025-02-10 10:52:34

WinForm窗口閃爍C#

2025-04-08 08:01:31

2010-04-16 11:11:46

Oracle存儲過程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人免费网 | 欧美一级艳情片免费观看 | 国产一区二区麻豆 | 精品一二 | 亚洲精品免费视频 | 久久精品国产99国产精品亚洲 | 亚洲一区二区视频在线观看 | 永久av| 91中文在线观看 | 国产亚洲一区二区三区 | 成人免费在线小视频 | 黑人性hd | 国产精品网址 | 羞羞在线观看视频 | 91中文字幕 | 日韩精品一区二区三区中文在线 | 999久久久久久久久6666 | 国产精品久久久久久久免费大片 | av在线免费看网址 | 亚洲欧美日本在线 | 日韩综合在线播放 | 99爱在线观看 | 欧美国产精品一区二区 | a在线观看免费 | 欧美一级免费看 | 欧美一区二区在线视频 | 亚洲精品国产成人 | 亚洲成人精品在线 | 久久国产一区二区 | www.久久精品视频 | 国产一级片在线观看视频 | 97色在线视频 | 日本天堂视频 | 国产精品日韩欧美 | 7777奇米影视| 中文字幕av网站 | 免费观看视频www | 老司机狠狠爱 | 99久久免费精品国产免费高清 | 8x国产精品视频一区二区 | 欧美日韩在线一区二区 |