aocache:AOCache 新增功能深度解析:從性能監控到靈活配置的全方位升級

最近對aocache 進行了重要升級,最新版本0.6.0增加了幾項新功能:性能分析日志AOCache性能分析工具切入點自定義配置全局配置,本文詳細說明這幾項目新功能的作用和使用方式。

一、性能分析日志

需求背景

對于哪些方法適合使用aocache注解提高性能,開始我是憑經驗和直覺來判斷的。

但是對于下面這個方法,憑直覺你覺得用方法緩存能提高性能么?

    public String next(String expression) {if (expression == null || expression.length() == 0) {return null;}boolean indexed = false;boolean mapped  = false;for (int i = 0; i < expression.length(); i++) {char c = expression.charAt(i);if (indexed) {if (c == ']') {return expression.substring(0, i + 1);}} else if (mapped) {if (c == ')') {return expression.substring(0, i + 1);}} else {if (c == '.') {return expression.substring(0, i);} else if (c == '(') {mapped = true;} else if (c == '[') {indexed = true;}}}return expression;}

這是一個太簡單的循環字符比較。不涉及任何復雜的計算。

我覺得它的計算量不大,憑經驗覺得它的計算量不大,而且執行結果與字符串長度有關,但這個方法的調用頻率非常高。

我意識到,要真正有效得應用aocache提供的方法計算結果緩存功能以提高系統整體執行效率,開發人員需要一種定量化的分析機制,為方法計算結果緩存功能提供更準確的執行效能評估。以幫助開發人員判斷是否啟用方法計算結果緩存功能。

要提供定量化的分析,首先aocache需要提供性能分析日志功能,即aocache執行切入點(JoinPoint)方法時能夠準確記錄每次切入點調用執行時間并持久化保存(csv)。

有了這些原始的記錄,才能談后續分析,借助AI,應該能很方便的解決問題。

設計目標

  • 建立定量化監控機制,記錄每個被緩存方法的計算耗時和緩存調用耗時
  • 生成結構化數據文件(CSV)供離線分析
  • 減少性能監控對系統本身的影響(異步持久化機制)
  • csv記錄的字段
  • JoinPoint [String]方法簽名,字符串中有,號,所以需要前后用雙引號包括。
    • ArgsHash [Integer]方法調用參數的hash code,不需要保存完整參數,否則數據量太大
    • Count [Long]方法調用的計數器,用于區分是計算執行(=1)用還是緩存命中(>1),參見 InvokeKey.aroundCounter字段
    • Cost [Long]方法調用執行時間(納秒)

使用方式

性能分析日志默認是關閉的,你可以命令行參數:在啟動 JVM 時,添加 -Daocache.profiler.enableLog=true 參數來開啟性能日志記錄。例如:

java -Daocache.profiler.enableLog=true -jar your-application.jar

二、AOCache性能分析工具

演進歷程

當我拿到這樣的CSV日志文件后,真是天書啊。嘗試用AI或EXCEL進行分析,發現很麻煩。
在這里插入圖片描述

于是我決定將基于csv文件性能的分析工具化。設計一個python腳本來執行對原始csv文件的分析

  1. 計算每個JoinPoint的計算執行平均時間(RA)和緩存命中平均時間(CA),時間單位轉為毫秒,計算執行次數(RC),緩存命中次數(CC)

  2. 計算每個JoinPoint的總執行時間(JT)和JoinPoint總執行次數(JC)

  3. 計算每個JoinPoint 所有調用中 緩存命中的比例(CR),即CR=CC/(RC + CC)

  4. 計算每個JoinPoint 緩存命中的效率(CEM),即CEM=RA/CA

  5. 計算每個JoinPoint出緩存命中調用與計算執行所用開銷減少比例,即綜合性能提升百分比(PR),公式 PR=JT/(RA x JC) x 100RA x JC可以理解為假設所有執行都是在沒有緩存命中的執行總時間,JT與它的比值就可以理解使用緩存功能后執行時間減少的。

核心指標

  • CEM(緩存效率倍數):量化緩存帶來的效率提升
  • LEVEL(優化等級):★級指導配置決策
  • CR(緩存命中率):驗證緩存配置合理性

使用示例

# 分析當天日志,輸出為html
python aopanalyzer.py # 分析當天日志,輸出為xlsx
python aopanalyzer.py --output xlsx# 分析指定日期日志(20240315)
python aopanalyzer.py 20240315 --output report.xlsx# 分析指定文件
python aopanalyzer.py input.csv --output analysis.html

生成報告(HTML)示例:

在這里插入圖片描述

三、切入點自定義配置

核心痛點

aocache通過注解方式定義方法啟用計算緩存,對于每一個切入點而言,在編譯期就已經定義了緩存的配置(weakKeys,maximumSize,expireAfterAccess等等)。

但實際應用場景中,通過AOCache 性能分析結果,可能會發現有些配置對切入點的綜合性能提升并不理想,需要調整,這種情況下,如果切入點并不在當前項目,想要根據應用場景修改切點,就會很麻煩。

所以需要一種切入點(JoinPoint)自定義配置機制,可以允許通過外部以切入點配置文件的形式對切入點的配置進行調整。

配置文件示例

如下以**${JoinPoint}=配置描述字符串**的形式對切入點進行調整:

# 關閉切入點緩存能力
execution(public static java.util.Date com.gitee.l0km.aocache.example.ctw.DateSupport.parseDateString(java.lang.String, java.lang.Class))=false
# 定義切入點緩存配置
call(com.gitee.l0km.aocache.example.ctw.AocacheCtwTest.TestUser())={weakKeys=true,maximumSize:100}

啟用配置

需要設置usingLoadedJoinPoints=true啟用自定義切入點配置功能:

1. 修改默認配置文件

${user.home}/.aocache/aoconfig.properties中添加:

usingLoadedJoinPoints=true
2. 系統屬性配置

啟動JVM時添加參數:

java -Daocache.usingLoadedJoinPoints=true -jar your-app.jar

切入點配置文件加載位置與優先級

  1. 類路徑配置META-INF/aocache.joinpoints文件(支持多JAR包聚合)
  2. 用戶目錄配置${java.home}/.aocache/aocache.joinpoints文件
  3. 環境變量配置AOCACHE_JOINPOINTS環境變量指定的文件

四、全局配置

核心價值

允許應用程序從外部配置文件來控制這些全局配置參數。

配置文件示例

${user.home}/.aocache/aoconfig.properties:

# AoCache Configuration
# 基礎配置
# debugOutput: 是否啟用調試輸出(默認:false)
#logger.debugOutput=false# debugOutputDetail: 是否輸出詳細調試信息(默認:false)
#logger.debugOutputDetail=false# override: 是否啟用注解定義的日志配置覆蓋全局配置(默認:false)
#logger.override=false# usingLoadedJoinPoints: 是否使用加載的切入點配置(默認:false)
#usingLoadedJoinPoints=false# outputAroundCost: 是否輸出環繞方法耗時(默認:false)
#logger.outputAroundCost=false# 性能分析配置
# profiler.enableLog: 是否啟用性能分析(默認:false)
#profiler.enableLog=false# profiler.logFolder: 緩存性能分析器的日志文件夾路徑,默認${user.home}/.aocache/profiler
#profiler.logFolder=# profiler.flushInterval: 性能分析日志寫入間隔時間(毫秒),默認5000
#profiler.flushInterval=5000# profiler.cleanLogFile: 是否在啟動時清理舊的性能分析日志文件(默認:false)
#profiler.cleanLogFile=false

總結:打造性能優化閉環

通過監控采集 → 分析定位 → 動態調整 → 固化配置的完整鏈路,aocache實現了緩存優化的科學決策。

詳細說明參見碼云倉庫:aocache

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74909.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74909.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74909.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java EE 進階:MyBatis-plus

MyBatis-plus的介紹 MyBatis-plus是MyBatis的增強工具&#xff0c;在MyBatis的基礎上做出加強&#xff0c;只要MyBatis有的功能MyBatis-plus都有。 MyBatis-plus的上手 添加依賴 在我們創建項目的時候&#xff0c;我們需要添加MyBatis-plus和mysql的依賴 MyBatis-plus的依賴…

GitHub和Gitee上的一些AI項目

以下是GitHub和Gitee上的一些AI項目&#xff1a; GitHub上的AI項目 TensorFlow&#xff1a;一個端到端開源機器學習平臺&#xff0c;包含大量工具和庫&#xff0c;廣泛應用于圖像識別、自然語言處理等領域。PyTorch&#xff1a;由Facebook開發的開源深度學習框架&#xff0c;…

JavaScript網頁設計高級案例:構建交互式圖片畫廊

JavaScript網頁設計高級案例&#xff1a;構建交互式圖片畫廊 在現代Web開發中&#xff0c;交互式元素已成為提升用戶體驗的關鍵因素。本文將通過一個高級案例 - 構建交互式圖片畫廊&#xff0c;展示如何結合HTML和JavaScript創建引人入勝的網頁應用。這個案例不僅涵蓋了基礎的…

Linux命令大全:從入門到高效運維

適合人群&#xff1a;Linux新手 | 運維工程師 | 開發者 目錄 一、Linux常用命令&#xff08;每天必用&#xff09; 1. 文件與目錄操作 2. 文件內容查看與編輯 二、次常用命令&#xff08;按需使用&#xff09; 1. 系統管理與監控 2. 網絡與通信 3. 權限與用戶管理 三、…

Windows 10/11 使用 VSCode + SSH 免密遠程連接 Ubuntu 服務器(指定端口)

摘要&#xff1a; 本文詳細介紹如何在 Windows 系統上通過 VSCode Remote-SSH 免密登錄遠程 Ubuntu 服務器&#xff08;SSH 端口 2202&#xff09;&#xff0c;避免每次輸入密碼的繁瑣操作&#xff0c;提高開發效率。 1. 環境準備 本地系統&#xff1a;Windows 10/11遠程服務…

一些需要學習的C++庫:CGAL和Eysshot

寫在前面&#xff1a; 從開始工作到現在&#xff0c;去過多家公司&#xff0c;多個行業&#xff0c; 雖然大部分時間在通信業&#xff0c;但也有其它的行業的工作沒有做完&#xff0c;但也很感興趣。每次想要研究一下時&#xff0c;總是想不起來。 這里寫一些信息&#xff0c;…

藍橋杯16天刷題計劃一一Day01

藍橋杯16天刷題計劃一一Day01&#xff08;STL練習&#xff09; 作者&#xff1a;blue 時間&#xff1a;2025.3.26 文章目錄 藍橋杯16天刷題計劃一一Day01&#xff08;STL練習&#xff09;[P1540 [NOIP 2010 提高組\] 機器翻譯 - 洛谷 (luogu.com.cn)](https://www.luogu.com.…

相對位置2d矩陣和kron運算的思考

文章目錄 1. 相對位置矩陣2d2. kron運算 1. 相對位置矩陣2d 在swin-transformer中&#xff0c;我們會計算每個patch之間的相對位置&#xff0c;那么我們看到有一連串的拉伸和相減&#xff0c;直接貼代碼&#xff1a; import torch import torch.nn as nntorch.set_printoptio…

Redis 版本演進及主要新特性

Redis 版本發布歷史 穩定版本時間線 Redis 2.6 (2012年)Redis 2.8 (2013年11月)Redis 3.0 (2015年4月) - 首次支持集群Redis 3.2 (2016年5月)Redis 4.0 (2017年7月)Redis 5.0 (2018年10月)Redis 6.0 (2020年4月)Redis 6.2 (2021年2月)Redis 7.0 (2022年4月) - 最新穩定版(截至…

HTML5 Geolocation(地理定位)學習筆記

一、HTML5 Geolocation簡介 HTML5 Geolocation&#xff08;地理定位&#xff09;API用于獲取用戶的地理位置信息。通過這個API&#xff0c;可以獲取用戶的緯度、經度、海拔等信息。由于地理定位可能涉及用戶隱私&#xff0c;因此只有在用戶同意的情況下&#xff0c;才能獲取其…

愛普生VG3225EFN壓控晶振5G基站低噪聲的解決方案

在 5G 通信網絡的高速發展中&#xff0c;系統噪聲的控制成為保障網絡可靠性與數據吞吐量的關鍵。愛普生 VG3225EFN 壓控晶振憑借其卓越的低噪聲特性&#xff0c;成為 5G 基站時鐘系統的理想選擇。通過創新的技術設計&#xff0c;這款晶振不僅為基站提供了穩定的時鐘基準&#x…

【問題解決】Linux安裝conda修改~/.bashrc配置文件后,root 用戶下顯示 -bash-4.2#

問題描述 在Linux安裝conda下的python環境時候&#xff0c;修改了~/.bashrc文件&#xff0c;修改完成后&#xff0c;再次進入服務器后&#xff0c;登錄時候顯示的不是正常的[rootlocalhost ~]#&#xff0c;而是-bash-4.2# 原因分析&#xff1a; 網上原因有&#xff1a;/root下…

機器學習knnlearn5

import numpy as np from os import listdir from sklearn.neighbors import KNeighborsClassifier as kNN# 此函數用于將一個32x32的文本文件轉換為一個1x1024的一維向量 def img2vector(filename):"""將32x32的文本文件轉換為1x1024的向量:param filename: 要…

git revert 用法實戰:撤銷一個 commit 或 merge

git revert 1 區別 ? 常規的 commit &#xff08;使用 git commit 提交的 commit&#xff09; ? merge commit 2 首先構建場景 master上的代碼 dev開發分支上&#xff0c;添加一個a標簽&#xff0c;并commit這次提交 切到master上&#xff0c;再次進行改動和提交 將de…

自然語言處理|高效法律助手:AI如何解析合同條款?

引言&#xff1a;法律 AI 的崛起 在數字化浪潮快速發展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是一個陌生的概念&#xff0c;它正以快速發展滲透到各個領域&#xff0c;法律行業也不例外。從智能合同審查到法律風險預測&#xff0c;AI 技術為法律工作帶來…

【數據分享】2000—2024年我國鄉鎮的逐年歸一化植被指數(NDVI)數據(年最大值/Shp/Excel格式)

之前我們分享過2000-2024年我國逐年的歸一化植被指數&#xff08;NDVI&#xff09;柵格數據&#xff0c;該逐年數據是取的當年月歸一化植被指數&#xff08;NDVI&#xff09;的年最大值&#xff01;另外&#xff0c;我們基于此年度柵格數據按照行政區劃取平均值&#xff0c;得到…

辦公網絡健康監控(域名健康監控)

需求 辦公室訪問一些網絡經常出現故障 現需要時時觀察監控這些網絡的健康 包含專線網等其他網絡 實施 支持 SNMP 且支持 Webhook 發送報警的開源監控系統 hertzbeat:關系型數據庫+時序數據庫; Zabbix:關系型數據庫; LibreNMS:關系型數據庫; Prometheus(包含ale…

藍橋杯 合并數列

問題描述 小明發現有很多方案可以把一個很大的正整數拆成若干個正整數的和。他采用了其中兩種方案&#xff0c;分別將它們列為兩個數組&#xff1a; {a?, a?, ..., a?}{b?, b?, ..., b?} 兩個數組的元素和相同。 定義一次合并操作為&#xff1a;將某個數組中相鄰的兩…

【行駛證識別】批量咕嘎OCR識別行駛證照片復印件圖片里的文字信息保存表格或改名字,基于QT和騰訊云api_ocr的實現方式

項目背景 在許多業務場景中,如物流管理、車輛租賃、保險理賠等,常常需要處理大量的行駛證照片復印件。手動錄入行駛證上的文字信息,像車主姓名、車輛型號、車牌號碼等,不僅效率低下,還容易出現人為錯誤。借助 OCR(光學字符識別)技術,能夠自動識別行駛證圖片中的文字信…

個人學習編程(3-29) leetcode刷題

最后一個單詞的長度&#xff1a; 思路&#xff1a;跳過末尾的空格&#xff0c;可以從后向前遍歷 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的長度&#xff0c; int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //從字符串末尾開始//…