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.mzph.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; //从字符串末尾开始//…