15个问题自查你真的了解java编译优化吗?

从ADI GitHub到我的ZYNQ板:一份给硬件工程师的AD9361裸机(no-OS)移植自查清单 本文详细介绍了如何将AD9361裸机(no-OS)驱动从ADI GitHub移植到ZYNQ硬件平台的完整流程。内容涵盖工程准备、开发环境配置、HDL工程编译、no-OS工程集成及硬件验证等关键步骤,特别针对硬件工程师提供实战技巧和常见问题解决方案,帮助快速实现高性能软件定义无线电系统的开发。 阅读详情
摘要:为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了。

本文分享自华为云社区《你真的了解java编译优化吗?15个问题考察自己是否理解》,作者:breakDraw 。

首先提出一个问题,为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了。

这里会提15个问题确认是否真的理解,如果完全没这方面的概念,则好好看一下文章末尾的“jvm编译优化笔记”章节。

早期编译过程

Q: java早期编译过程分为哪3步?
A:

  1. 词法语法解析、填充符号表
  2. 注解处理
  3. 语义分析与字节码生成。

Q: 上面的步骤中, 符号表是干吗的?
A:
符号表是符号地址和符号信息构成的表格。

  • 用于后面阶段做语法检查时,从表里取出信息进行对比。
  • 符号表是目标代码生成时的地址分配的依据

Q: 注解处理器做的什么事情?
A: 注解处理器会扫描抽象语法树中带注解的元素, 并进行语法树的更新。
重点就是他是基于语法树做更新。
更新之后我们会重新走回解析与填充的过程,重新处理。

Q: 上面的3个步骤中, 解语法糖是哪一步?
A:
是第三步,在生成字节码的时候才做的语法糖处理。

Q: 什么是解语法糖?大概有哪些?
A:

  • 虚拟机本身不支持这种语法, 但是会在编译阶段 把这些语法糖转为 普通的语法结构。
  • 包含自动装拆箱、 泛型强转应用。

Q: 生成字节码class文件的时候, final和非final的局部变量, 会有区别不?
A:
没有区别。
局部变量不会在常量池中持有符号引用, 所以不会有acesses_flasg信息。
** 因此final局部变量在运行期没有任何作用, 只会在编译期去校验。**

Q: a= 1 + 2会在什么阶段进行优化?
A: 会在早期编译过程的语义分析过程中,进行常量折叠, 变成a=3
同理, 字符串+号优化成stringBuilder.append()这个动作也是该阶段优化的。

Q: 类对象加载的过程有一堆顺序(具体见类初始化顺序, 这个顺序在字节码中体现的吗?还是运行的时候再判断顺序?
A:
字节码中体现的。

  • 在字节码生成时, 编译器针对对象new的过程,会生成了一个<init>方法,里面写明了成员、构造方法的调用顺序。
  • 类静态成员的调用顺序同理封装在<cinit>中。

晚期编译优化

Q:
早期编译优化和晚期编译优化的区别?
A:

  • 早期编译优化, 是把 java文件转成字节码,转字节码的过程中做一些简单优化和语法糖处理。
  • 晚期编译优化,是将字节码转机器码执行的过程中,结合一些信息进行动态优化,或者应用上很多的机器码优化措施。

Q: java程序运行的时候,是直接全部转成优化后的机器码再运行吗?
A:
错误。

  • 当程序刚启动时,会先马上使用解释器发挥作用,这时候没做太多优化,直接解释执行。
  • 在程序运行后, 编译器逐步发挥作用,把还没用到的代码逐步编译成机器码。

注意这里的编译器和之前提到的编译器的区别,一个是编译成字节码,另一个是编译成机器码。

Q: 有两种晚期优化编译器

  • Client Compiler ——C1编译器
  • Server Compiler——C2编译器
    他们二者的区别是什么?

A:

  • 速度和质量的区别:
    C1编译器, 更高的编译速度,编译质量一般。
    C2编译器, 更好的编译质量,但是速度慢。
  • 优化特性的区别
    C1编译器都是一些不需要运行期信息就能做优化的操作。
    C2编译器则会根据解释器提供的监控信息,进行激进且动态的优化

Q: java中怎么区分用C1还是C2?
A:
关于这2种编译器的参数:

  • -Xint参数: 强制使用解释模式
  • -Xcomp参数: 强制使用编译模式( 但是如果编译无法进行时, 解释会介入)
  • 选择编译模式时,有-client、-server还有MixedMode(混合模式)可以选择

混合模式中, JDK7引入了分层编译策略:
第0层: 解释执行。 不开启性能监控。
第1层: C1编译, 把字节码编译为本地代码, 进行一些简单优化, 加入性能监控
第2层: C2编译, 启动耗时较长的优化, 根据性能监控信息进行激进优化

Q: 分层优化中,如果正在运行,jvm是怎么知道需要对哪些代码做JIT或者OSR优化?
A:

  1. 被多次调用的方法。 会触发JIT编译(热点代码计数器)
  2. 被多次执行的循环体, 会触发OSR编译(栈上替换), 发生在方法执行过程中, 所以是在栈上编译并切换方法。(使用回边计数器)

Q: 哪些方法会在早期优化中做内联,哪些方法会在晚期优化中做内联?
A:

  • 不能被继承重写的方法,比如私有、构造器、静态之类的方法,可以直接在早期优化中做内联优化。
  • 其他会被抽象继承实现的方法在早期无法做内联,因为他不知道实际是用哪一段代码.
  • 晚期优化中可以根据一些运行信息,判断是否总是只用某个子类方法跑,是的话做一下尝试内联,如果后面来了其他的子类就切回去。

Q: java数组一般都会自动做边界检查,不满足就抛异常。 什么情况下会优化掉这个自动检查?
A:
运行期,发现传入的参数放到数组中用的时候, 肯定不会超出边界,则会优化掉这个检查动作。

看完上面的,就可以给出C++和java编译和运行速度差距的原因了:

  1. java即时编译可能会影响用户体验,如果在运行中出现较大影响的延迟的话。
  2. java中虚方法比C++要多, 因为做各种内联分析消耗的检查和优化的就越多越大
  3. java中总是要做安全检查, C++中不做,出错了我就直接崩溃了越界了
  4. C++中内存释放让用户控制, 无需后台弄一个垃圾回收器总是去检查和操作
  5. java好处: 即时编译能够以运行期的性能监控进行优化,这个是C++无法做到的

jvm编译优化学习笔记

早期

编译过程大致分为3类:

  1. 解析与填充符号表
  2. 注解处理
  3. 分析与字节码生成
    关键点:
  • 词法语法解析是第一步,生成符号
  • 注解处理是第二步
  • 然后语法糖、字节码都是第三步的事情。

上述步骤的详细解释:

第一步:

-------词法分析:

就是代码转成token标记。
例如int a=b+2 转成 Int \a=\b+\2 这6个token。

-------语法分析(注意实际上只是生成一个语法树,还没做语法的校验):

根据生成的token,构造一个抽象语法树。

-------填充符号表:

生成一个符号地址和符号信息构成的表格。
(后面第三步的阶段会用于语义分析中的标注检查, 比如名字的使用是否和说明一致,也会用于产生中间代码)
符号表是目标代码生成时的地址分配的依据

第二步:

-------注解处理器:

注解处理器会扫描抽象语法树中带注解的元素, 并进行语法树的更新。
更新之后我们会重新走回解析与填充的过程,重新处理。
这个处理器是一种插件,我们可以自己不断往其中去添加。

注意,上面这2步只是简单去对源文件做转换, 还不涉及任何语法相关的规则。

第三步:

-------语义分析:

判断语法树是否正确。分为2种检查:

  1. 标注检查: 检查变量是否已被声明、 赋值、等式的数据类型是否匹配
    标注检查中会进行常量折叠, 把a=1+2折叠成3
    标注检查的范围比较小,不会有太多上下文依赖。
  2. 数据及控制流分析
    对程序上下文逻辑更进一步验证
    这里会涉及很多交互的上下文交互依赖
    比如 带返回值的方法是否全路径都包含了返回、 受检异常是否被外部处理、局部变量使用前是否被赋值。

final 局部变量(或者final参数)和非final局部变量,生成的class文件没有区别。
因为局部变量不会在常量池中持有符号引用, 所以不会有acesses_flasg信息。
所以class文件不知道局部变量是不是final, 因此final局部对运行期没有任何影响, 只会在编译期去校验。

-------解语法糖:

虚拟机本身不支持这种语法, 但是会在编译阶段 把这些语法糖转为 普通的语法结构(换句话说做了把语法糖代码变成了普通代码, 例如自动装拆箱,可能就是转成了包装方法的特定调用)

-------字节码生成:

对象的初始化顺序, 实际上会在字节码生成阶段, 收敛到一个<init>方法中。 即init中控制了那些成员、以及构造方法的调用顺序
类初始化同理,也是收敛到一个 <cinit>中
PS: 注意,默认构造器是在填充符号表阶段完成的。
字符串的替换(+操作转成sb) 是在字节码阶段生成的。
完成了对语法树的遍历之后,会把最终的符号表交给ClassWRITE类,设计概念从一个字节码和文件

晚期

HotSpot中, 解释器与编译器共存。
当程序刚启动时,会先马上使用解释器发挥作用。
在程序运行后, 编译器逐步发挥作用,把还没用到的代码逐步编译。
内存资源比较少的情况下,可以用解释器来跑程序,减少编译生成的文件。
如果编译器的优化出现bug,可以通过“逆优化”回退到最初的解释器模式来运行

解释器Interperter

编译器

有两种编译器

  • Client Compiler ——C1编译器, 更高的编译速度
  • Server Compiler——C2编译器, 更好的编译质量
    即选择了-client或者-server时会用到。
  • 默认混合模式: 解释器和编译器共存, 即MixedMode。

关于这2种编译器的参数:

  • -Xint参数: 强制使用解释模式
  • -Xcomp参数: 强制使用编译模式( 但是如果编译无法进行时, 解释会介入)

混合模式中, 解释器需要收集性能信息,提供给编译阶段判断和优化, 这个性能信息有点浪费
因此JDK7引入了分层编译策略:

  • 第0层: 解释执行。 不开启性能监控。
  • 第1层: C1编译, 把字节码编译为本地代码, 进行一些简单优化, 加入性能监控
  • 第2层: C2编译, 启动耗时较长的优化, 根据性能监控信息进行激进优化

CC和SC编译过程的区别:

  • client Compiler 编译过程:
    前端字节码-》 方法内联/常量传播(基础优化)-》 HIR(高级中间代码)-》 空值检查消除/范围检查消除
    -》 后端把HIR转成LLR(低级中间代码)-》 线性扫描算法分配寄存器-》窥孔优化-》机器码生成-》本地代码生成
    都是一些不需要运行期信息就能做优化的操作
  • serverCompiler编译过程:
    会执行所有的经典优化动作
    会根据cc或者解释器提供的监控信息,进行激进的优化
    寄存器分配器是一个全局图着色分配器

晚期优化的一些常见措施(即运行中才会做优化的步骤)

----热点代码

  1. 被多次调用的方法。 会触发JIT编译
  2. 被多次执行的循环体, 会触发OSR编译(栈上替换), 发生在方法执行过程中, 所以是在栈上编译并切换方法。

HotSpot 使用 计数器的热点探测法确定热点代码。
* 给每个方法建立方法计数器, 在一个周期中如果超过阈值, 就触发JIT编译,编译后替换方法入口。
* 如果一个周期内没超过,则计数器/2(半衰)
* 如果没有触发时, 都是用解释方式 按照字节码内容死板地运行。

该计数器的相关参数
-XX:-UserCounterDecay 关闭热度衰减
-XX: CounterHalfLifeTime 设置半衰期-XX:CompileThreshold 设置方法编译阈值

回边计数器就是计算循环次数的计数器
* 没有半衰
* 但是当触发OSR编译时,会把计数器降低,避免还在运行时重复触发。
* 会溢出, 并且会把方法计数器也调整到溢出。
* clint模式和server模式中, OSR的阈值计算公式不同, clint= CompileThredshold * osr比率, server= CompileThredshold * (osr比率 - 解释器监控比率)

—冗余访问消除:

如果已经拿到了 a.value, 该方法内a.value一定不会变的话, 那么后续用到时就不再从a中取value了
复写传播:

y=b.value
z=y
c = z + y

变成

y = b.value
y = y
c = y + y

无用代码消除:
去掉上面的Y=y

----公共子表达式消除

就是对一些比较长的计算公式做化简
a+(a+b)2
会优化成
a3+b*2
尽可能减少计算次数

—数组边界检查:

如果能确定某个for循环里的数组取值操作一定不会超出数组范围,那么在做[]取值操作时,不会做数组边界检查。

—隐式异常处理:

if(a == null) {
xxx
}
else{
throw Exception
}
优化成
try {
xxx
} catch(Exception e) {
throw e
}

----方法内联:

不能被继承重写的方法,比如私有、构造器、静态之类的方法,可以直接在早期优化中做内联优化。
而其他会被抽象继承实现的方法在编译器无法做内联,因为他不知道实际是用哪一段代码。

  • final方法并不是非虚方法(为什么呢)
  • 类型继承关系分析CHA: 如果发现虚方法,CHA会查一下当前虚拟机内该方法是否有多个实现, 如果发现只有这一种实现,那么就可以直接内联。
  • 如果后续有其他的class动态加载进来后,该方法有多个实现了,并且被使用到了,那么就会抛弃已编译的内联代码,回退到解释状态执行。
  • 内联缓存: 即使程序中发现该方法有多个实现, 依然对第一个使用的那个方法做内联,除非有其他重写方法被调用(即虽然你定义了,但是你很可能不用,所以我一直使用你的第一个方法,除非你真的用了多种重写方法去跑。

----逃逸分析:

分析new 出来的对象是否不会逃逸到方法外, 如果确认只在方法内使用,外部不会有人引用他, 那么就会做优化,比如:
* 不把new出来的对象放到堆,而是放到方法栈上,方法结束了对象直接消失。
* 不需要对这种对象做加锁、同步操作了
* 标量替换: 把这个对象里的最小基本类型成员拆出来作为局部变量使用。

----java和C++, 即时编译和静态编译的区别:

  1. 即时编译可能会影响用户体验,如果在运行中出现较大影响的延迟的话

java中虚方法比C++要多, 因为做各种内联分析消耗的检查和优化的就越多越大
3.
java中总是要做安全检查, C++中不做,出错了我就直接崩溃了越界了
4.
C++中内存释放让用户控制, 无需后台弄一个垃圾回收器总是去检查和操作
5.
java好处: 即时编译能够以运行期的性能监控进行优化,这个是C++无法做到的。

Android 16 KB页面大小适配的权威技术方案总结 适配16 KB页大小是。 阅读详情

相关推荐

Java加密扩展:Bouncy Castle安装配置与JCA Provider机制详解

Java Cryptography Architecture(JCA)是Java平台的标准加密服务框架,通过Provider机制提供可插拔的算法实现。其核心原理在于Security类管理的Provider列表,JVM按优先级顺序查找可用算法实现。这一设计使得开发者能够灵活扩展加密功能,在需要国密算法、特定证书格式或性能优化时,可集成第三方Provider。Bouncy Castle作为最流行的开源JCA Provider,支持SM2/SM3/SM4等非标准算法和PKCS#12等格式处理,广泛应用于金融支付、

weixin_30443075的博客 406

15 个问题自查真的了解 java 编译优化吗

首先提出一个问题,为什么 C++的编译速度会比 java 慢很多?二者运行程序的速度差异在哪? 了解了 java 的早期和晚期过程,就能理解这个问题了。 这里会提 15 个问题确认是否真的理解,如果完全没这方面的概念,则好好看一下文章末尾的“jvm 编译优化笔记”章节。 早期编译过程 Q: java 早期编译过程分为哪 3 步?A: 1.词法语法解析、填充符号表 2.注解处理 3.语义分析与字节码生成。 Q: 上面的步骤中,符号表是干吗的?A:符号表是符号地址和符号信息构成的表格.

wadfdhsajd的博客 189

BirdCLEF鸟类音频识别:从梅尔频谱图到CNN模型的完整实践

音频分类是机器学习的重要应用领域,其核心原理是将声音信号转化为计算机可处理的数字特征。梅尔频谱图作为一种关键的时频表示技术,模拟了人耳对声音的非线性感知,能够有效捕捉音频信号中的关键模式。这项技术的价值在于,它使得卷积神经网络等图像处理模型得以应用于声音识别任务,从而在生态监测、语音助手和多媒体内容分析等场景中发挥重要作用。本文以BirdCLEF鸟类识别竞赛为背景,详细阐述了如何利用梅尔频谱图和卷积神经网络构建一个完整的音频分类基线系统,涵盖了从数据预处理、特征工程到模型训练与评估的全流程,为处理复杂的野外

weixin_30394669的博客 476

Java编译优化你真的读懂了吗?15个问题考验一下自己

文章目录早期编译过程晚期编译优化 首先提出一个问题,为什么C++的编译速度会比java慢很多?二者运行程序的速度差异子啊那? 了解了java的早期和晚期过程,就能理解这个问题了。 这里会提15个问题确认是否真的理解,如果完全没这方面的概念,则好好看一下前面的早期和晚期编译优化读书笔记 早期编译过程 Q: java早期编译过程分为哪3步? A: 词法语法解析、填充符号表 注解处理 语义分析与字节码生成。 Q: 上面的步骤中, 符号表是干吗的? A: 符号表是符号地址和符号信息构成的表格。 用于后面

DrawnBreak 681

山大编译原理实验:Java实现Lexer/Parser/符号表工程实践

词法分析器(lexer)和语法分析器(parser)是编译器前端的核心组件,其本质是将源代码字符流转化为结构化抽象语法树(AST)的确定性转换过程。理解lexer的状态机建模、parser的递归下降原理,以及符号表的作用域管理机制,是掌握编译原理工程落地的关键。这些技术不仅支撑静态语言编译流程,也广泛应用于IDE智能提示、代码格式化、DSL解析等现代开发工具链。在Java工程实践中,lexer负责正则匹配与行列定位,parser构建AST并保障错误恢复能力,符号表则通过作用域栈实现语义检查——三者通过严格接

weixin_29973493的博客 308

编译原理实践指南:从词法分析到语义分析的完整实现

编译原理是计算机科学的核心基础,它研究如何将高级编程语言转换为机器可执行代码。其核心流程遵循词法分析、语法分析、语义分析等阶段,涉及有限自动机、上下文无关文法等关键技术。理解编译原理不仅能深化对程序运行机制的认识,更是提升系统编程和性能优化能力的关键。在工程实践中,手动实现编译器前端是掌握这些概念的绝佳方式。通过构建词法分析器处理Token流,运用递归下降法进行语法分析生成AST,再到语义分析实现符号表管理和类型检查,这一完整流程将抽象理论转化为具体代码。本文聚焦于**山东大学编译原理实验**的实践过程,详

416

Java编译注意问题,编写Java程序时要注意的一些问题

1.for循环执行效率问题在写for循环时,注意循环的终结条件应避免多次访问统一变量 ,例如int a[] = new int [10];for(int i = 0; i < a.length;i++)这里的 i < a.length 会被多次访问,应该在循环外部将循环的次数写好改正后的:int a[] = new int [10];int alength = a.length;for...

weixin_32452829的博客 539

从SFF-8087到SFF-8643:详解服务器硬盘背板连接线缆的演变与实战接线

本文深度解析了服务器硬盘背板连接技术从SFF-8087到SFF-8643的演进历程,重点介绍了SAS、SATA和U.2接口的技术特点与实战接线方案。通过对比不同连接器标准的物理特性和电气规范,提供了混合环境下的线缆选择策略和常见故障排查指南,帮助IT专业人员优化存储系统性能与稳定性。

weixin_30603633的博客 275

从 Spring Boot 3+Java 21 到 Spring Boot 4+Java 25:迁移全指南

SpringBoot4正式发布,基于SpringFramework6.2和Java25 LTS版本,为开发者带来新特性与性能提升。本文提供迁移指南:1)环境准备需升级JDK25+及构建工具;2)重点关注核心依赖版本变更;3)适配SpringBoot4的自动配置简化、Web层调整等破坏性变更;4)利用Java25虚拟线程、字符串模板等新特性优化代码;5)通过兼容性测试和性能基准测试确保平稳过渡。文末附迁移Checklist和版本对照表,建议分阶段验证并迁移。

★【World Of Moshow 郑锴】★ 6670

强网杯Web题ezphp解题全记录:利用PHP反序列化与条件竞争拿下服务器

本文详细解析了强网杯Web题目ezphp的解题过程,通过PHP反序列化与条件竞争漏洞的组合利用,成功获取服务器权限。文章深入剖析了反序列化链的构造、文件上传绕过技巧以及条件竞争的实际应用,为CTF选手和Web安全研究者提供了宝贵的实战经验。

weixin_29006187的博客 376

AI辅助专利撰写实战:30分钟高效产出发明专利初稿

在技术创新的浪潮中,专利撰写常常是开发者将创意转化为知识产权保护壁垒的关键一步,但这个过程往往耗时费力,需要兼顾技术深度与法律文书规范。近期,借助AI辅助工具来提升专利撰写效率已成为一个热门探索方向。本文将围绕如何利用AI工具,在30分钟内高效完成一篇具备授权潜力的发明专利初稿,进行一场从0到1的实战演练。无论你是独立开发者、初创团队的技术负责人,还是希望保护自己研究成果的学生,这套方法都能帮助你快速梳理技术方案,形成结构严谨、逻辑清晰的专利申请文档。 1. 背景与核心概念:AI辅助专利撰写的价值与边界 在

weixin_34253126的博客 493

Java应用性能优化实战:JVM核心参数解析与内存问题排查指南

Java虚拟机(JVM)作为Java应用的核心运行环境,其内存管理与垃圾回收机制直接影响着应用的性能与稳定性。理解JVM内存模型与GC原理,是进行性能调优的基础。通过合理配置堆内存、元空间等关键参数,并选择合适的垃圾回收器,可以有效提升吞吐量、降低延迟。在工程实践中,面对内存溢出(OOM)、频繁Full GC等常见性能瓶颈,掌握JDK自带的jstack、jmap等诊断工具,能够快速定位问题根源,例如分析线程死锁或排查内存泄漏。本文聚焦于JVM调优的核心参数配置与实战排查技巧,为构建高可用的Java服务提供系

leonard61306500的专栏 317

基于Arduino的智能垃圾桶

通过本次简单的Arduino智能垃圾桶小实验可以快速了解Arduino的基本用法 1、材料准备 Arduino UNO HC-SR04超声波模块 SG90舵机 杜邦线 电源 电脑 2、代码分析 电机的控制 #include<Servo.h> #define duoji D5 Servo myduoji; void setup() { myduoji.attach(duoji); //舵机连接 Serial.begin(115200); } void loop() { myduoji.w

weixin_41679960的博客 1万+

Claude Code Token消耗优化指南

会话 3d0e69b0 仅 36 条历史记录,却消耗 301M tokens,说明单轮携带上下文极大,存在内部循环。:Claude Code 的 Bash 环境不继承 Windows 系统 PATH,必须通过。:前 20 会话占总费用的 60%+,单会话最高达 301M tokens。:排除 94% 无关文件,索引从 750MB 降至 ~200KB。:自动压缩 Bash 命令输出,节省 60-90% tokens。:替代自动索引,每次请求减少 20-50K tokens。Claude Code 使用。

cpa0701的博客 906

Java接入DeepSeek大模型:从零实现流式对话+多轮会话管理(完整项目实战)

emitter.completeWithError(new RuntimeException("连接DeepSeek服务超时"));private static final Set<String> BLACK_WORDS = Set.of("暴力", "色情", "政治敏感");emitter.onCompletion(() -> log.info("SSE连接完成"));emitter.onTimeout(() -> log.warn("SSE连接超时"));// 每个路由基础连接数。

wjianwei666的专栏 927

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程

本文为三相四线制整流器在中点电位不平衡时的Simulink仿真教程。首先分析中点电位漂移的电荷不平衡机理,提出零序电压注入控制策略。详细演示建模步骤:搭建三相四线制主电路,构建中点平衡控制算法(含MATLAB函数代码),实现控制信号叠加与PWM生成。通过对比仿真验证控制效果,并给出零序电压限幅、中性线电感影响等工程建议。该方案能有效抑制三相不平衡负载下的中点电位波动,保证系统稳定运行。

xiaoheshang_123的博客 50

macOS 安装 OpenCV 的 3 条路线:pip、Homebrew 与源码编译如何选

OpenCV(Open Source Computer Vision Library)是目前使用最广的开源计算机视觉库之一,覆盖图像处理、特征检测、相机标定、深度学习推理等能力,Python 和 C++ 开发者都可以直接调用。但很多新手卡住的地方不是"装不上",而是"不知道该走哪条路":pip 装的是哪个版本?Homebrew 的包能不能满足 C++ 开发?什么时候才必须自己编译源码?这篇文章先帮

gitblog_00293的博客 324

14 | TensorFlow2对阿拉伯语手写字符数据集进行识别

该数据集由 60 名参与者书写的16,800 个字符组成,年龄范围在 19 至 40 岁之间,90% 的参与者是右手。每个参与者在两种形式上写下每个字符(从“alef”到“yeh”)十次,如图 7(a)和 7(b)所示。表格以 300 dpi 的分辨率扫描。使用 Matlab 2016a 自动分割每个块以确定每个块的坐标。该数据库分为两组:训练集(每类 13,440 个字符到 480 个图像)和测试集(每类 3,360 个字符到 120 个图像)。数据标签为1到28个类别。

微信号:RunsenLiu 2876

Java 8到JDK 21升级实战:虚拟线程、结构化并发与兼容性考量

在Java技术生态中,并发编程和代码简洁性是开发者持续关注的核心领域。其原理在于通过更高效的资源管理和更清晰的语言结构来提升应用性能与可维护性。从技术价值看,这直接关系到高并发服务的吞吐量、系统稳定性以及开发效率。典型的应用场景包括微服务架构下的I/O密集型处理、复杂数据流转换以及大规模任务生命周期管理。本文聚焦于JDK 21引入的虚拟线程和结构化并发等革命性特性,探讨如何在仍广泛使用的Java 8生产环境中,通过思想借鉴、模式模拟和渐进式优化,为未来升级铺平道路,并系统分析升级过程中的兼容性风险与实战策略

weixin_30252709的博客 374

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

阿里巴巴Dragonwell17 JDK极速部署与生产环境调优指南

阿里巴巴Dragonwell17作为阿里巴巴深度优化的OpenJDK发行版,专为大规模生产环境设计。本文将为您提供从零开始的快速部署方案、智能配置调优和故障排查实战指南。 ## ⚡ 90秒极速上手:构建属于你的阿里巴巴Dragonwell17 现在让我们一起在90秒内完成阿里巴巴Dragonwell17的构建部署: **⏩ 步骤1:环境预检(15秒)** ```bash # 检查编译依赖 g

gitblog_00688的博客 904

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

北京赞同2017校招Java笔试题全解析:基础为王,实战制胜

Java基础是后端开发的核心竞争力,无论是集合框架、多线程还是数据库事务,都直接决定系统稳定性。在银行科技领域,扎实的代码功底比堆砌框架更受重视。北京赞同作为金融IT服务商,其校招笔试聚焦JavaSE、SQL和算法,通过具体场景考察候选人的工程素养。本文以2017年真题为例,拆解HashMap扩容、synchronized与volatile、SQL分组统计、快速排序等高频考点,并给出答题策略与代码优化思路,帮助求职者建立从语法到并发、从数据库到算法的完整知识体系,从容应对金融科技类公司的笔试筛选。

weixin_33797791的博客 446

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

鸿蒙5.0应用生态现状:微信支付宝能用吗?这些App还没适配

本文全面解析鸿蒙5.0应用生态现状,重点解答用户关心的微信、支付宝等日常App适配问题。目前已有超过15,000个应用完成原生适配,包括社交、支付、生活服务等国民级应用,运行效果优于安卓版本。同时提供应用兼容性自检指南和未适配应用的临时解决方案,帮助用户顺利过渡到纯血鸿蒙系统。

weixin_30300225的博客 1405

2026年Java面试趋势与核心考点深度解析

Java作为企业级开发的核心语言,其技术栈持续演进,尤其在云原生和响应式编程领域展现出强劲的发展势头。从技术原理来看,JVM内存模型、并发编程机制以及框架底层实现构成了Java工程师的核心知识体系。这些技术不仅支撑着高并发、低延迟的系统需求,更在云原生转型中发挥着关键作用。以Spring WebFlux为例,其背压处理和响应式编程模型正成为微服务架构的重要支撑。同时,随着GraalVM和JDK21等技术的普及,Java应用的启动性能和资源利用率得到显著提升。在2026年的技术面试中,企业更加注重工程实践能力

weixin_31155097的博客 302

帆软春招研发岗A卷复盘:数据库与场景设计是分水岭

研发岗笔试通常涵盖数据结构、算法、数据库等基础知识,但不同行业对技术能力的考察侧重点差异明显。报表与商业智能工具的核心工作围绕数据提取、聚合和可视化展开,因此数据库与SQL能力成为这类厂商研发岗位的必备技能。掌握多表关联、分组聚合、窗口函数以及索引优化等原理,不仅是为了应对笔试,更是工程实践中处理真实数据问题的技术根基。在企业报表和BI系统中,权限控制、大数据量下查询性能优化、多部门数据协同等场景,都要求开发者具备将业务抽象为技术方案的能力。本文以帆软2019届春招研发岗位A卷为线索,逐模块拆解笔试中的易错

weixin_30443075的博客 405
上一篇: SpringCloud 2020.0.4 系列之Hystrix看板
下一篇: 模板设计模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值