背景
有一天,群里收到小伙伴提的一个问题,为什么程序 sensitive-word 第一次执行这么慢?
初步验证
自己本地用 v0.27.1 验证了一下,确实很奇怪,第一次明显很慢。
为了排除一些干扰项,我们把一些配置先关闭。
最简单的我们用 System.nanoTime 输出一下耗时,用 mills 也行。
public static void main(String[] args) {
final List<
String> allWord = Arrays.asList("敏感","最强","定制", "81", "医疗器械");
String demo1 = "产品尺寸参数§60mn§50mm§210枚/包§160枚/包§名称A4银色不干胶§规格60mm*40mm 送配套模板§规格70mm*50mm 送配套模板§数量每大张21枚一包10张总计210枚§数量每大张16枚一包10张总计160枚§适用激光打印机打印油性笔书写§95mm§100mn§55mm§100枚/包§80枚/包§名称 A4银色不干胶§规格95mm*55mm 送配套模板§规格100mm*70mm 送配套模板§数量每大张10枚一包10张总计100枚§数量 每大张8枚一包10张 总计80枚§100mm§120枚/包§140枚/包§规格80mm*50mm 送配套模板§规格100mm*40mm 送配套模板§数量每大张12枚一包10张总计120枚§数量§每大张14枚包10张总计140枚§适用 激光打印机打印油性笔书写§40mm§65mm§70mm§35mm§200枚/包§240枚/包§规格70mm*40mm送配套模板§规格§65mm*35mm 送配套模板§数量 每大张20枚一包10张总计200枚§每大张24枚包10张总计240枚§适 激光打印机打印油性笔书写§适用§激光打印机打印油性笔书写§40mn§280枚/包§360枚/包§规格50mm*40mm 送配套模板§规格40mm*30mm 送配套模板§数量每大张28枚一包10张总计280枚§数量每大张36枚一包10张总计360枚§45.7mm§38.1mm§400枚/包§650枚/包§45.7mm*25.4mm送配套模板§38.1mm*21.2mm 送配套模板§每大张40枚一包10张总计400枚§数量每大张65枚一包10张总计650枚§30mm§25mr§20mm§840枚/包§1260枚/包§规格 30mm*20mm 送配套模板§规格25mm*13mm 送配套模板§数量每张84枚包10张总计840枚§数量每大张126枚一包10张总计1260枚§46mm§意制§任§1000枚/包§定§名称定制A4内割银不胶§规格46mm*11.1mm送配套模板§任意规格定制§每大张100枚包10张总计1000枚§包10张满5包送专属模板§适激光打印机打印油性笔书写§产品实拍§8格打印实拍展示(100mm*70mm)§上海荠骞文化用品固定资产标识卡§资产编号:§规格型号:§资产名称:§使用状态:§资产类别:§资产原值§存放地点§生产厂家:§使用人§备§注:§*请爱护公司财产,不要随意撕毁此标签§16格全内容打印实拍展示§固定资产标识卡§资产名称§四层货架(平板)§资产编号§3F跑菜区§规格型号§1800×500×1500§使用部门§财务部§使用时间§2019-04-26§李强§21格手写款打印展示 (60mm*40mm)§固定资标识卡§36格打印实拍展示(40mm*30mm)§固定资产标签§名称:§编号:§部门:§40格打印实拍展示(45.7mm*25.4mm)§固定资§名称:电脑§编号:20210§部门:财务部§20210201§使用人:我最强§八:找最强§编号:20210201§65格打印实拍展示(38mm*21mm)§名称:§编号:§数量:§数量:§100格打印实拍展示(46mm*11.1mm)§客服电话:159 9569 3815§: 159 9569 3815§.§客服电话:159 9569§客服电话:1599§客服电话§服电话:159 9569 3815§话:159 9569 3815§客服电话:1599569 3815§电话:159 9569 3815§9569 3815§159 9569 3815§客服电话:§低值易耗品标识牌(70mm*50mm)§购买日期§保管部门§责任人§生产厂家§不要随意撕毁此标牌*§*请爱护公司财产,不要随意撕导§品标识牌§低值易耗品标识牌§随意撕毁此标牌*§*请爱护公司财产,不要随意撕毁此标牌*§三人沙发§行政酒廊§2200*860*900§2018-07-23§应用范围§多用于产品信息固有资产登记航空仓库管理 医疗政府机构等§Mainly used for product information inherent assets registration, aviation warehouse management, medi§cal government institutions, etc§政府单位§企业办公§仓储行业§医疗器械§教育单位§耐用品§电子产品包装§商城卖场";
// 初始化敏感词库
SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance()
.wordFailFast(true)
.wordAllow(WordAllows.empty())
.wordDeny(new IWordDeny() {
@Override
public List<
String> deny() {
return allWord;
}
})
.ignoreChineseStyle(false)
.ignoreCase(false)
.ignoreEnglishStyle(false)
.ignoreNumStyle(false)
.ignoreRepeat(false)
.ignoreWidth(false)
.wordTag(WordTags.none())
.init();
costTimeTest(sensitiveWordBs, demo1);
}
private static void costTimeTest(SensitiveWordBs sensitiveWordBs, String demo1) {
int count = 5;
for (int i = 0; i < count; i++) {
long startTime = System.nanoTime();
List<
String> emitWord1 = sensitiveWordBs.findAll(demo1);
long costTime = System.nanoTime() - startTime;
System.out.println("cost=" + costTime);
}
}
输出:
cost=27687800
cost=3623000
cost=2764000
cost=4456500
cost=6652700
这里是纳秒,看比例也看得出第一次比较慢。
long ns = 1_000_000_000L; // 1 秒 = 1e9 纳秒
long us = 1_000_000L; // 1 秒 = 1e6 微秒
long ms = 1_000L; // 1 秒 = 1e3 毫秒
排除问题
确认了问题之后,就要找到到底慢在哪里。
有一些方法:
1)每个方法加耗时日志,适用性广,但是比较麻烦。如果没有源代码的话,也无法直接修改。
2) 用 Profiling 工具更方便一些。
Java Flight Recorder (JFR)(JDK 自带,jcmd 或 jfr 启动)
VisualVM(免费 GUI,适合初步分析)
Async Profiler + 火焰图(性能瓶颈定位神器)
YourKit / JProfiler(商业工具,功能更全)
初步猜想
一些初步的猜想:
第一次执行,初始化加载了一些信息比较慢。
后续执行被 jvm 编译优化了,性能提升。
因为后续执行耗时明显下降,一些场景的比如 IO、锁之类的可以暂时排除。
idea 中使用 profile
说明
本地使用的是 idea 免费社区版本。
IDEA Ultimate
IDEA Ultimate 自带了对 Java Flight Recorder (JFR) 的支持。启动应用时,点 Run → Profile…,选择 Java Flight Recorder。
IDEA + Async Profiler 插件
IDEA 提供了 Async Profiler 集成(从 2020.3 开始支持)。
用法:右键 Run 旁边选择 Profile with Async Profiler。
输出直接是 火焰图,更直观地看哪一层方法耗时最多。
当然,这两个方法直接用用一个不足,那就是前面的初始化信息也会被记录,有一定的干扰性。
所以需要次数多一些,比如1W次
编码 profile
JDK 11+ 提供了 jdk.jfr API,可以在代码里手动控制录制
import jdk.jfr.Recording;
import java.nio.file.Path;
public class JFRDemo
{
public static void main(String[] args) throws Exception {
try (Recording recording = new Recording()) {
recording.start();
// 运行你要分析的代码
MyUtil.someMethod();
recording.stop();
recording.dump(Path.of("app.jfr"));
// 保存到文件
}
}
}
我们略微调整
private static void costTimeTest(SensitiveWordBs sensitiveWordBs, String demo1) throws IOException {
int count = 5;
try (Recording recording = new Recording()) {
recording.start();
for (int i = 0; i < count; i++) {
long startTime = System.nanoTime();
List<
String> emitWord1 = sensitiveWordBs.findAll(demo1);
long costTime = System.nanoTime() - startTime;
System.out.println("cost=" + costTime);
}
recording.stop();
recording.dump(Path.of("app.jfr"));
// 保存到文件
}
}
执行后可以看到根目录下 app.jfr,发现这个生成 jfr 有问题。
jfr 文件如何文件如何打开分析呢?
jmc
JDK 11+ 一般自带 JMC(或者单独下载安装 JMC)
jmc
然后选择打开,发现自己的 jdk11 并没有,应该和 jvisual 一样,后续被单独拆开了。
官网下载: https://www.oracle.com/java/technologies/jdk-mission-control.html
或者 OpenJDK 社区版的 JMC: https://github.com/openjdk/jmc
下载后直接运行 JMC GUI,然后打开 .jfr 文件进行分析。
下载
可以在 https://www.oracle.com/java/technologies/javase/products-jmc9-downloads.html 页面选择合适自己的安装包。
firefox profiler
看了一下 Async Profiler 用的应该就是 https://profiler.firefox.com/ 这个页面分析文件的。
如果可以的话,你也可以直接用这个网页。
可以选择本地的 JFR 文件,或者是 URL。
整体耗时优化
1万次
这是一个循环调用 1W 次的例子,可以看到整体的耗时:
可以直接打开这个链接查看: https://share.firefox.dev/4lZljPd
整体耗时:7890ms
long time = System.currentTimeMillis();
costTimeTest(sensitiveWordBs, demo1);
long cTime = System.currentTimeMillis() - time;
System.out.println("---DONE"+cTime);
慢的点
可以看到比较慢的2个点
String.toCharArray(): char[]
54%InnerWordFormatUtils.formatCharsMapping(String, IWordContext): Map
11%
优化方案
针对1,我们尝试优化一下,toCharArray 看 String 源码会重新创建 chars,占用内存,我们尽可能的避免。
/**
* Converts this string to a new character array.
*
* @return a newly allocated character array whose length is the length
* of this string and whose contents are initialized to contain
* the character sequence represented by this string.
*/
public char[] toCharArray() {
return isLatin1() ? StringLatin1.toChars(value)
: StringUTF16.toChars(value);
}
针对2,用 char[] 数组替代肯定是最好的,但是字符比较复杂,暂时还是 map 适用性更强。
如果不指定格式转换,可以考虑 map 为空,取不到用原始值,减少这一份消耗。
InnerWordFormatUtils.formatCharsMapping(String, IWordContext): Map 优化
优化方案:新增一个针对整体字符串 format 的处理类 IWordFormatText,如果 IWordFormat 是系统默认的 none,直接返回 emptyMap
限制场景:仅针对不做任何优化的场景有作用。
内存优化:只有映射 c 和 mc 不同,才放入映射 map
实现:
/**
* 默认实现
*
* @author d
* @since 0.28.0
*/
public class WordFormatTextDefault
extends AbstractWordFormatText {
@Override
protected Map<
Character, Character> doFormat(String text, IWordContext context) {
// 单个字符串里信息
final IWordFormat wordFormat = context.wordFormat();
// 不需要处理的场景
if(wordFormat.getClass().getName().equals(WordFormatNone.class.
getName())) {
return Collections.emptyMap();
}
Map<
Character, Character> map = new HashMap<
>();
for(int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
char mc = wordFormat.format(c, context);
if(c != mc) {
map.put(c, mc);
}
}
return map;
}
}
JFR 对比效果:JFR 为 7571
严谨起见,我们加一下额外项目的测试对比,对比5次
v0.27.1 直接运行1W次,5 次均值:7255 ,明细如下:
7613
7166
7156
7176
7164
新代码直接运行1W次,均值 7139.4,明细如下:
7650
7074
7002
6979
6992
看来这个 cpu 火焰图和时间耗时不是严格等价。
这里只提升了 1% 左右的性能。
罢了,看在内存的面子上,我们先发布一个版本。
发布
此代码发布,放在 v0.28.0 版本。
针对 toCharArray 的改进
思路
我们尽量避免 toCharArray,使用原始的字符串 string.charAt 替代。
不过这个 charAt 有一点不太好:
public char charAt(int index) {
if ((index <
0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
如果 jdk 能提供一个直接访问的方法将完美,可惜去不得。
好处
带来的好处就是节省了 toCharArray 带来的方法+内存消耗。
修改点
修改点比较多,涉及到的地方够改掉了。
遗憾的是破坏了两个带 chars 的接口,接口本身设计的不够好。
ISensitiveWordCharIgnore
和 IWordReplace
从原始的 chars->text
效果
新代码,同样1w次循环,耗时 508.8ms,明细:
792
456
449
410
437
和 v0.28.0 对比提升了多少倍呢?大概 14 倍
7139.4 ÷ 508.8 ≈ 14.03
反思
这个大概率是每次 case 都一样,导致 jvm 优化效果很不错。
随机测试
我们来用随机,对比测试一下
测试 CASE
public static void main(String[] args) {
for(int k = 0; k <
5; k++) {
// 1W 次
long start = System.currentTimeMillis();
for(int i = 0; i <
10000; i++) {
String randomText = "产品尺寸参数§60mn§50mm§210枚/包§160枚/包§名称A4银色不干胶§规格60mm*40mm 送配套模板§规格70mm*50mm 送配套模板§数量每大张21枚一包10张总计210枚§数量每大张16枚一包10张总计160枚§适用激光打印机打印油性笔书写§95mm§100mn§55mm§100枚/包§80枚/包§名称 A4银色不干胶§规格95mm*55mm 送配套模板§规格100mm*70mm 送配套模板§数量每大张10枚一包10张总计100枚§数量 每大张8枚一包10张 总计80枚§100mm§120枚/包§140枚/包§规格80mm*50mm 送配套模板§规格100mm*40mm 送配套模板§数量每大张12枚一包10张总计120枚§数量§每大张14枚包10张总计140枚§适用 激光打印机打印油性笔书写§40mm§65mm§70mm§35mm§200枚/包§240枚/包§规格70mm*40mm送配套模板§规格§65mm*35mm 送配套模板§数量 每大张20枚一包10张总计200枚§每大张24枚包10张总计240枚§适 激光打印机打印油性笔书写§适用§激光打印机打印油性笔书写§40mn§280枚/包§360枚/包§规格50mm*40mm 送配套模板§规格40mm*30mm 送配套模板§数量每大张28枚一包10张总计280枚§数量每大张36枚一包10张总计360枚§45.7mm§38.1mm§400枚/包§650枚/包§45.7mm*25.4mm送配套模板§38.1mm*21.2mm 送配套模板§每大张40枚一包10张总计400枚§数量每大张65枚一包10张总计650枚§30mm§25mr§20mm§840枚/包§1260枚/包§规格 30mm*20mm 送配套模板§规格25mm*13mm 送配套模板§数量每张84枚包10张总计840枚§数量每大张126枚一包10张总计1260枚§46mm§意制§任§1000枚/包§定§名称定制A4内割银不胶§规格46mm*11.1mm送配套模板§任意规格定制§每大张100枚包10张总计1000枚§包10张满5包送专属模板§适激光打印机打印油性笔书写§产品实拍§8格打印实拍展示(100mm*70mm)§上海荠骞文化用品固定资产标识卡§资产编号:§规格型号:§资产名称:§使用状态:§资产类别:§资产原值§存放地点§生产厂家:§使用人§备§注:§*请爱护公司财产,不要随意撕毁此标签§16格全内容打印实拍展示§固定资产标识卡§资产名称§四层货架(平板)§资产编号§3F跑菜区§规格型号§1800×500×1500§使用部门§财务部§使用时间§2019-04-26§李强§21格手写款打印展示 (60mm*40mm)§固定资标识卡§36格打印实拍展示(40mm*30mm)§固定资产标签§名称:§编号:§部门:§40格打印实拍展示(45.7mm*25.4mm)§固定资§名称:电脑§编号:20210§部门:财务部§20210201§使用人:我最强§八:找最强§编号:20210201§65格打印实拍展示(38mm*21mm)§名称:§编号:§数量:§数量:§100格打印实拍展示(46mm*11.1mm)§客服电话:159 9569 3815§: 159 9569 3815§.§客服电话:159 9569§客服电话:1599§客服电话§服电话:159 9569 3815§话:159 9569 3815§客服电话:1599569 3815§电话:159 9569 3815§9569 3815§159 9569 3815§客服电话:§低值易耗品标识牌(70mm*50mm)§购买日期§保管部门§责任人§生产厂家§不要随意撕毁此标牌*§*请爱护公司财产,不要随意撕导§品标识牌§低值易耗品标识牌§随意撕毁此标牌*§*请爱护公司财产,不要随意撕毁此标牌*§三人沙发§行政酒廊§2200*860*900§2018-07-23§应用范围§多用于产品信息固有资产登记航空仓库管理 医疗政府机构等§"
+ RandomUtil.randomString("1234567890bcdefghiJKLMNOPQRSTUVWXYZ", 100);
SensitiveWordHelper.findAll(randomText);
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
新代码
实际测试发现这个在文本长的时候,效果更显著。应该是 toCharArray 的代价更高
5次均值 1785.2:
2308
1621
1595
1664
1738
v0.28.0
5 次均值:7636.4
8438
7463
7404
7436
7441
总结
这个测试文本量,效果大概提升 4 倍
文本越长,效果越显著。
查看一次耗时
说明
无论是整体跑,还是单个跑,都会发现第一次明显比较慢。
多次跑应该是 jvm 优化,我们来看一下单词的
我们回到问题的最开始,看的出来平均耗时优化了,但是初始化耗时还是这么慢。
跑5次
5 次效果如下:
21
1
1
1
1
单词跑有个问题,前面的 wordBs 初始化干扰太大,我们暂时用加耗时的方法来处理下。
第二个问题:mills 不够精确,可以用 nanoTime 替代。
我们改为 nanoTime 跑5次
看起来 ms 差不多,实际上还是差很多的。
13518800
2854600
1836900
1503900
925400
我们重点看一下第一次为什么这么慢。
子方法耗时拆分
演示一下,二分法:
public <
R> List<
R> findAll(final String target, final IWordResultHandler<
R> handler) {
// ArgUtil.notNull(handler, "handler");
long s1 = System.nanoTime();
List<
IWordResult> wordResults = sensitiveWord.findAll(target, context);
System.out.println(System.nanoTime()-s1);
long s2 = System.nanoTime();
List<
R> res = CollectionUtil.toList(wordResults, new IHandler<
IWordResult, R>() {
@Override
public R handle(IWordResult wordResult) {
return handler.handle(wordResult, context, target);
}
});
System.out.println(System.nanoTime()-s2);
return res;
}
耗时:
17042800 #findAll
2316800 #handle
22018600 #total
不过有一个问题,这个不太稳定。只能看比例。
很离谱的一个点:
中间只隔了下面的方法,耗时 3ms。
public List<
String> findAll(final String target) {
return findAll(target, WordResultHandlers.word());
}
原因
所以第一次请求,涉及到了
JVM 类和方法还没加载:第一次调用 sensitiveWord.findAll 可能会触发类加载、静态初始化。
JIT(即时编译)没起作用:第一次运行是解释执行,速度慢。
热点优化没完成:JIT 会把频繁调用的方法编译成本地代码,但需要多次调用才会触发。
解决方案
其实也不难,可以提前调预热一下。
在 init() 的时候,指定预热策略,简单的触发一下。
避免不太懂的性能测试的伙伴执着于第一次的问题。
策略支持用户自定义。
效果
优化后的效果,还是会有一些,不过可以接受。
4520900
2804500
2493600
976000
1011100
和 v0.28.0 对比
20762000
3903400
3401200
8672000
7852000
第一次峰值从 20ms=>5ms 左右。
反思
jvm 的内置优化过于强求暂时意义不大,还是推荐性能压测先做预热。
小结
性能优化是一个支持以恒的过程,每次的改动都可能会导致性能有所影响。
这个系列后续更新了几个版本,感兴趣的小伙伴可以看一下:
v0.28.0+v0.29.0 敏感词性能优化值本地方法调用为何这么慢?
v0.29.1 敏感词性能优化-0.29.1-内部类+迭代器内部类
v0.29.2 基本类型拆箱、装箱的进一步优化的尝试
v0.29.3 依赖的繁简体转换 opencc4j 优化
相关文章:
sensitive-word 敏感词性能提升14倍优化全过程 v0.28.0 - 实践
sensitive-word 敏感词性能提升14倍优化全过程 v0.28.0 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...
2025 PHP 开发者必看得 25 个容易犯的常见错误 90% 的开发者都踩过
2025 PHP 开发者必看得 25 个容易犯的常见错误 90% 的开发者都踩过 前言 PHP 发展到今天,新特性层出不穷,最佳实践也在不断更新。写出干净、高效、好维护的代码,对每个 PHP 开发者来说都很重要。 这篇文章总结了 PHP 开发中最容易踩的坑,以及对应的解决方案。 不管你是刚入…...
一款带有AI功能的markdown工具
大家好,我是晓凡。 写在前面 关注晓凡的同学都知道,晓凡是一名程序员。 平常有空的时候会写写博客,将一些技术干货或者踩过的坑分享给大家。 和我一样写技术博客的小伙伴都知道,平常素材来源太杂:脑子里突然而来的灵感 群里的一张梗图 随手的一张截图 读书看到的一段文字 …...
45万亿!中国智驾的新风口来了
微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 添加图片注释,不超过 140 字(可选)2025年L4智驾场景化应用加速发展,亿欧汽车研究院认为2035年中国L4级别及以上智能驾驶…...
apache poi 导出繁琐的excel表格
apache poi 导出繁琐的excel表格pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...
Ubuntu Server SSH 连接
使用 SSH 连接(最推荐的方式) 这是最专业、最稳定的方式,特别适合服务器环境:一、在 Ubuntu Server 中确保 SSH 服务已安装并运行: sudo apt update sudo apt install -y openssh-server sudo systemctl enable ssh sudo systemctl start ssh 二、获取虚拟机的 IP 地址: …...
利用竞态条件轻松上传Web Shell
本文详细介绍了如何通过竞态条件漏洞上传PHP Web Shell,使用普通Burp Intruder工具而非Turbo Intruder,包含完整的攻击步骤、PHP代码分析和实战配置,适合初学者理解文件上传漏洞的利用方式。通过竞态条件上传Web Shell(简易方法) 方法特点 本攻击使用普通Burp Intruder而非…...
我亲眼目睹我上海的家长朋友陷进去了
微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 354695541004908701我发现在网上很多人都在说不要内卷了,不要卷了,因为我们快被自己人卷死了。我这人天生迟钝,后知后觉的,所以总是赶不上时…...
蔚小理的辅助驾驶,谁最拉跨?
微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087汽车诞生以来,从来没试过像现在这样,一台车可以在买回来之后,不花一分钱,表现就能获得提升。而且还不只是那些贵的车型,就…...
C 语言的 printf() 函数
概述 printf() 的作用: Print formatted output to the standard output stream. printf() 的函数原型: int printf( const char *format, argument1, argument2, ... );printf() 函数的基本格式: printf(格式字符串, 待打印项列表);或者写为: printf(格式字符串, 待打印项 1,…...
【GitHub每日速递 250915】3 个宝藏开源项目:超长语音合成、算法学习库、自托管软件导航,开发者速收
原文:【GitHub每日速递 250915】3 个宝藏开源项目:超长语音合成、算法学习库、自托管软件导航,开发者速收 VibeVoice:挑战传统TTS,最长90分钟多角色语音合成神器来袭! VibeVoice 是一个长对话文本转语音模型的开源项目。简单讲,它能将连续的文本内容自然地转换成语音,支…...
C 语言头文件
两种写法: #include <stdio.h> // 编译系统在系统头文件所在目录搜索 #include "stdlib.h" // 编译系统首先在当前的源文件目录中查找 stdlib.h,找不到的话,再转向系统头文件所在目录搜索引用系统头文件时,使用两种形式都可以,但是 #include <> 的…...
AFL++环境搭建
第 1 步:更新软件源并安装基本工具 首先更新软件包列表 sudo apt update 升级现有软件包 sudo apt upgrade -y 安装基本编译工具(包括gcc) sudo apt install -y build-essential 安装Python3和相关工具 sudo apt install -y python3 python3-dev python3-pip 创建python符号…...
晚安
cai~一定是做梦,不然还能是什么,对不对? 总之就是梦到一年前的自己对我说话: 第一句:变菜了 第二句:本来就挺菜 然后开始大笑,前车窗上晃动着一双眼睛,小,但是不瞎。...
读人形机器人12体育领域
读人形机器人12体育领域1. 体育领域 1.1. 在体育竞技这个不断挑战人类极限的领域,人形机器人正以教练和训练助手的身份进入 1.2. 由金属材料、代码和AI技术打造的机器人,正在革新运动员的训练方式、恢复过程和竞技表现 2. 个性化训练计划 2.1. 追求卓越的运动表现既是一门科学…...
【QT】C++基础
前言 目前打算一周内学习QT的基本使用,从此篇"C++基础"文章开始记录分享学习经验。 C++及其各种定义C++是面向对象的,什么是面向对象,什么是面向过程? 举例 计算a+b的值: C语言,直接计算a+b;C++,先将a+b封装,封装到类里面形成一个方法,然后再通过这个类去…...
安全研究者的MCP服务器宝典:BugBounty工具集锦
本资源库汇集了多个专为漏洞赏金、渗透测试和信息安全研究设计的MCP服务器,提供一站式安全工具整合,帮助安全专业人员高效开展授权安全测试和研究工作。BugbountiesMCP 一个专为漏洞赏金、渗透测试和信息安全研究设计的Model Context Protocol (MCP) 服务器综合列表资源库。 …...
Unity的VisualStudio工程链接不同步、显示异常处理方法
前段时间,在某次更新项目工程后,原本好好的VS工程,变得不认Unity_Editor的宏、Using显示不正确了,一般来说,这个在Unity使用中,很常见,通用解决办法是:在Unity的Extrenal Tool里有一个Regenerate的按钮,直接重新生成解决方案。 关了Unity工程,到路径里把sln和proj这些…...
Java 高性能与可维护性实战:从语言特性到工程化全链路
一、设计目标:为什么“快”和“稳”必须同时追 在真实业务里,“快”(吞吐、延迟)与“稳”(可维护、可演进)往往拉扯。高性能带来的复杂度不应成为维护负担,而可维护的抽象也不应牺牲关键路径。可落地的目标是:可预测性能:接口在 SLA 下延迟稳定,P95/P99 可控。渐进式…...
二叉树的递归遍历
前中后序的递归遍历 递归算法的三要素确定递归函数的参数和返回值:要确定哪些参数是递归过程中需要处理的,需要处理的就在递归函数里面加上这个参数;然后确定每次返回的递归值是什么; 确定终止条件:必须写终止条件;如果不写终止条件就会栈溢出; 确定单层递归的逻辑: 确…...
我的大学成长与规划
大家好,我是李思慧,一名计算机科学与技术专业的大二学生。生活里,我是个爱折腾的人,喜欢在文字的世界里遨游,也热衷于用视频和图片记录生活、表达创意。 在信工分团委宣传部当干事到现在的部长,是我成长很快的一段时光。从最开始跟着学长学姐学习写各种活动和通知的推文,…...
【笔记】拉格朗日插值
拉格朗日插值的推导对于一个 \(n\) 次多项式 \(f(x) = \sum_{k = 0}^n a_kx^k\),我们只要知道它在 \(n+1\) 个不同点处的取值,就可以进一步解出它的系数 但使用高斯消元法的时间复杂度是 \({\cal O}(n^3)\) 的,如果我们只是想知道这个多项式在某一点 \(x\) 处的值,希望有复…...
自定义渲染管线(Unity Cocos)
参考链接: 团结引擎 - 手册: 在自定义渲染管线中创建简单渲染循环 可定制渲染管线(Deprecated) | Cocos Creator Custom SRP - Custom Render Pipeline | 三叔的数字花园 自定义渲染管线_Unity SRP从零搭建一套图形渲染管线_UWA学堂(翻译的Catlik,还收费) Unity Custom S…...
这是一个测试
这是一个测试...
文献阅读 | Survey of Hallucination in Natural Language Generation
问题描述 本文主要讲了NLG中的幻觉现象 幻觉定义:模型生成不忠实于源内容或无意义的文本 幻觉分类:内在幻觉(矛盾、完全错误的)、外在幻觉(无法被验证) 幻觉危害:隐私泄露 成因:评估指标:统计 metric:基于 n-gram 重叠,如 PARENT(结合源和目标)、Knowledge F1(对…...
技术 | LLaMA Factory微调记录重修版
之前投的那篇教程我自己回看一遍都不太搞得明白,从新梳理一遍 1. 云服务器准备 恒源云 (gpushare.com) 配置建议:GPU: RTX 3090 (24GB) 或 RTX 4090 (24GB) 系统: Ubuntu 20.04/22.04 存储: 至少 50GB 空间2. 环境检查与初始化 # 检查GPU状态 nvidia-smi# 检查系统信息 df -h…...
支付中心的钱包类业务应该怎么设计
钱包类业务在支付行业里有一些比较固定的模式(无论是支付宝余额宝、微信零钱,还是 Stripe Balance / Paytm Wallet),基本设计目标是:余额和资金安全:必须有严格的账实一致、幂等和防篡改能力。高并发读写:充值/消费/退款频繁,要求快速的扣减和回滚能力。清晰的流水:任…...
MySQL索引浅析
NORMAL:普通索引,仅用于加速查询,允许字段值重复。 UNIQUE:唯一索引,不仅能加速查询,还会强制字段值的唯一性(即该字段下的值不能重复)。 FULLTEXT:全文索引,用于全文搜索场景(如文章内容的关键词检索)。 SPATIAL:空间索引,用于地理空间数据类型(如 GEOMETRY、P…...
WF 2025 游记
第一次出国旅行因为错误在 EC-Final 显神威成功出线,我得以以 RCDS 随队人员的身份作为 ICPC Guest 参与 2025 ICPC World Final Baku. Day -5 被然叔拉到苏州给软件杯打工。 出站时落雨大暴,翻书包发现没有雨伞,凌乱中就看到然叔开着辆绿色 SUV 过来接我,到了苏州大…...
17.时间处理
17.时间处理日期和时间是日常编程常用的功能之一。如果没有日期和时间,会导致很多功能无法实现,例如日志记录、定时任务、时间延迟等。Go标准库提供了操作日期和时间的方法。在提到时间,还需要注意不同地区的时间会不一样,所以这里还需要考虑到不同时区、不同历法等带来的影…...
[MCP][02]快速入门MCP开发
快速入门MCP Server和MCP Client 开发,以及Client集成LLM前言 很多文档和博客都只介绍如何开发MCP Server,然后集成到VS Code或者Cursor等程序,很少涉及如何开发MCP Host和MCP Client。如果你想要在自己的服务中集成完整的MCP功能,光看这些是远远不够的。所以本文及后续的M…...
numpy入门
numpy 基本属性 import numpy as np arr = np.arange(15).reshape((3,5)) print(arr) # [[ 0 1 2 3 4],[ 5 6 7 8 9],[10 11 12 13 14]] print(type(arr)) # 类型 <class numpy.ndarray> print(arr.shape) # 形状元组 (3, 5) print(arr.ndim) # 维度 2 print(arr…...
【simpleFOC】一个电机如何模拟不同旋钮的手感反馈?
原文链接:https://mp.weixin.qq.com/s?__biz=MzU1NjEwMTY0Mw==&mid=2247597033&idx=2&sn=e92f8f1dec8b363aa209788354f8fa64&chksm=fad1130bfafd0b9af53b0f110e354d8772f6c5a0d98735690d1c0c75d0c3c75785ea1041ea1a&scene=27概述simpleFOC可以实现对各种…...
第一周作业2
我叫陈俊杰,今年19岁,目前是一名计算机相关专业的学生。很高兴能在博客园与大家分享我的学习与生活经历。 兴趣爱好 我热爱运动,尤其是羽毛球、篮球、游泳和攀岩。这些运动不仅让我保持了健康的体魄,也培养了我的团队协作能力和坚持不懈的精神。此外,我也喜欢探索新技术,…...
第一次课堂作业
大家好!我是一名数据科学与大数据技术专业的大三学生。如果用一句话形容现在的自己,那就是 “正处在专业技能积累的爬坡期,一边为过去的基础不扎实查漏补缺,一边对未来的技术方向满怀期待”。这篇博客想和大家聊聊我的故事、我的技能现状,以及我为接下来的学习和未来发展制…...
[高可用/负载均衡] Ribbon LoadBalancer: 开源的客户端式负载均衡框架
0 序言某项目上,原先为自建的数据库集群提供了负载均衡IP服务器(简称: ELB IP Server),客户端的数据库请求URL都统一走ELB IP。但随着业务量的增长,识别到一个严峻的现实:其一,考虑到未来的业务增长情况,云厂商提供的 ELB IP Server 云服务的入网带宽必将完全无法满足本项…...
梦话周记
忘记是哪天了。 傍晚,暗蓝色的天空,水雾,朦胧的光晕。 此时的天空与以往理解的深邃可谓是一点关系都没有,它的深邃不再来自于天空,而是来自于大海。什么地方是深蓝色的,湿润的,广阔的?海洋。 其实气体与液体有很多相似之处,它们都有浮力,都是流体。我们是不是也生活在…...
【电机控制】无刷电机结构阐述---磁极数、槽数
一、磁极数P与槽数N 1.磁极数P 定义:转子上磁极的数量,既转子上磁钢的数量,磁钢均匀的排列在转子上磁铁必定是NS极成对使用,所以极数必然是偶数。 2.槽数N 定义:定子铁芯的槽数量,既定子上的电磁铁极数量,每一个槽上都饶有一组线圈,如上图有12个槽,所以是12N电机由于无…...
金刚怒目是我哭
金刚怒目是我哭是你们太不善良,还是我太不正常马喽马基米退圈了。我下载的its my cry没了,my mujuca也只有前三集 这个可以说是我的入坑作 确实有点刻意 反正不是日常向 即使现在看来也是无可厚非的 但还是爆了 我应该说戾气很重吗 杂食党,,,理中客,和稀泥 说不出话 雨...
nginx使用默认端口80作为服务端口
背景:http默认端口是80,配置nignx.conf,希望服务url直接输入ip不用输入端口 给server配置80以及加default_server ,老是报错,后面发现是因为 include /etc/nginx/sites-enabled/*; 这个配置的server段占用了80 解决办法:把默认配置/etc/nginx/sites-available/default 里…...
机器学习和推荐算法顶级会议和期刊
在机器学习(ML)与推荐系统(Recommender Systems)领域,CIKM 和 TKDE 是信息检索、数据挖掘及数据库领域的重要学术载体,二者分别以会议(CCF A 类)和期刊(CCF A 类)形式存在,覆盖 “推荐算法”“用户行为分析”“知识图谱与推荐融合” 等核心方向,是该领域研究者发表…...
java使用mysql
用jdbc操作mysqlhttps://www.runoob.com/java/java-mysql-connect.htmlmysql8之前和之后的连接配置有差异。实际使用时,一般还需要个功能,就是连接池。这个springboot自带了,是hikari。hikari初始化的时候,也需要配置mysql的连接参数,所以一般都是在这里设置的。https://w…...
2025年医疗行业API安全最佳实践与深度案例分析:从理论到全面落地
2025年医疗行业API安全最佳实践与深度案例分析:从理论到全面落地医疗API安全是保障患者隐私和医疗数据安全的关键环节。医疗机构、信息化服务商和安全厂商需遵循GB/T《数据接口安全风险监测方法》要求,建立覆盖"发现-监测-处置"的全生命周期防护体系。以金华市中心…...
2026 NOI 做题记录(二)
推荐阅读:D、N、W、Y、Z、AB、AC、AD、AE、AFContest Link \(\text{By DaiRuiChen007}\)A. [ARC194E] Swap 0^X and 1^Y (3) Problem Link 删掉所有的串 \(0^x\) 以及 \(1^y\),每次操作不会跨过里面的连续段,因此剩下的串必定相同。 取出每个连续段,任意两个 \(0\) 连续段在…...
lc1027-最长等差数列
难度:中等(后期)题目描述给定一个数组,计算最长等差数列的长度示例 输入:nums = [3,6,9,12] 输出:4 解释:3 6 9 12输入:nums = [9,4,7,2,10] 输出:3 解释:4 7 10输入:nums = [20,1,15,3,10,5,8] 输出:4 解释:20 15 10 5题解思路:DPf(i,j): 以 i 结尾,公差为 j 结…...
13
#include <math.h>int main() { int n; scanf("%d", &n); while (n--) {int l, r;scanf("%d %d", &l, &r); int y_max = (int)sqrt(r);//算l的平方根,然后向上取整并强制转换为整数, y >= lint y_min = (int)ceil(sqrt(l));int c…...
np.zeros函数
np.zeros 是 NumPy 库中的一个非常常用的函数,它的作用是创建一个指定形状和数据类型的新数组,并用 0 来填充所有元素。 np.zeros 的基本用法 函数的完整签名是 numpy.zeros(shape, dtype=float, order=C)。shape:你想要创建的数组的形状。可以是一个整数(用于一维数组)或…...
Langchain之让LLM拥有记忆
langchain的Memory 如果AI有记忆,我们就不需要手动维护一个储存消息历史的列表 让LLM拥有记忆的方法有很多,我更喜欢使用的方法是以下方案,其优点是灵活度比较高 from langchain.memory import ConversationBufferMemory from langchain_core.prompts import ChatPromptTemp…...
25.9.14
(今天的)...
.net PublishSingleFile 打包程序提取
.net PublishSingleFile 打包程序提取 目录.net PublishSingleFile 打包程序提取提取 Bundle 的常用方法分界线工具SingleFileExtractor (低版本)SelfContainedExtractor (.NET 5+)定位offset <PublishSingleFile>true</PublishSingleFile>该部分内容为AI…...