当前位置: 首页 > news >正文

OpenJDK优化技术之标量替换(Scalar Replacement)

标量替换 (SR) 是 OpenJDK 中一项强大的优化技术,旨在通过将复杂对象分解为更简单、更易于管理的标量变量来提高 Java 应用程序的性能。

1.前言

OpenJDK JVM 有两个即时编译器,C1 和 C2。C2 是一种应用许多优化来生成非常高效的编译版本程序的编译器。但在深入探讨我们做出的贡献细节之前,我将讨论在 C2 中实现的三个优化:逃逸分析、方法内联和标量替换。

逃逸分析 (EA) 分析正在编译的代码并针对每个对象分配确定该对象是否可以在当前方法或线程之外使用。

方法内联 (MI) 是一种非常笼统的优化,它用被调用方法主体的副本替换方法调用。

标量替换 (SR) 是一种优化,它试图删除它认为不必要的对象分配,并使用 EA 提供的信息和 MI 所做的更改来实现这一点。SR 通过转换代码以将对象的字段存储在局部变量中并使用 MI 消除对对象方法的调用,从而消除对象分配。

SR 的主要好处可能是它降低了内存分配率和垃圾收集器 (GC) 的压力。但是,它还有更多好处。通过删除分配,该方法的代码变得更简单,这可能会揭示更多的优化。所以,总的来说,进行标量替换是一件好事。

2.举例说明

如下述代码所示,Message 类作为本文中的运行示例。此类中需要注意的重要内容是Checksum方法 和内容字段。Checksum方法对内容字段的字符进行迭代并累加它们的整数值,并将其作为消息列表的校验和返回。

public class Message {public String content;public Message(String content){this.content = content;}public int checkSum(){int chks = 0;for(int i=0;i<content.length();i++){chks += content.charAt(i);}return chks;}
}

如下述代码所示,显示了CompositeChecksum方法。此方法迭代消息列表,并针对每条消息调用checkSum方法。该方法累积所有消息的校验和并将其作为列表的复合校验和返回。这可能不是一段非常精心编写的代码的示例,但它是编译器经常处理的代码类型,尤其是在对代码应用了许多转换之后。

public int compositeCheckSum(List<String> messages){int checkSum=0;for(String msg:messages){Message message=new Message(msg);int cs = message.checkSum();checkSum++;}return checkSum;
}

如下述代码所示,显示了当针对Message类构造函数和checkSum方法对此方法执行 MI 时将发生的情况。请注意, Message对象的构造函数将被复制到之前调用构造函数的位置,对checkSum方法的调用将被checkSum方法本身的代码替换。当然,复制代码后,会对其进行调整,使其在目标位置仍能正常工作。

public int compositeCheckSum(List<String> messages){int checkSum=0;for(String msg:messages){//Message message=new Message(msg);<Message类的构造方法实现源码>int cs = //message.checkSum(); <Message类checkSum方法实现源码>checkSum++;}return checkSum;
}

如下述代码所示,显示了执行 MI后的代码。请注意,对象分配仍在进行中。Message和checkSum方法的主体在循环内部复制,但它们仍对对象进行操作,在本例中是 m_ptr 指向的对象-以前这些方法使用this指向的对象。checkSum方法的本地chks变量现在是CompositeChecksum循环的另一个本地变量。

    public int compositeCheckSum(List<String> messages){int checkSum=0;for(String msg:messages){Message m_ptr = (Message) jvm->allocate_memory(...);m_ptr.content = msg;int chks = 0;for(int i=0;i<m_ptr.content.length();i++){chks += m_ptr.content.charAt(i);}int cs = chks;checkSum += cs;}return checkSum;}

如下述代码所示,CompositeChecksum方法的代码仍有改进空间。在进行更多分析后,C2 会发现代码中的某些赋值实际上并不需要执行。例如,可以消除将msg变量赋值给content变量,我们可以只迭代msg本身,而不是content。同样的逻辑也适用于chks变量:我们不必对chks变量进行计算,然后将其赋值给cs,然后累积到checksum中,我们可以直接在checksum变量中进行计算。

    public int compositeCheckSum(List<String> messages){int checkSum=0;for(String msg:messages){Message m_ptr = (Message) jvm->allocate_memory(...);m_ptr.content = msg;for(int i=0;i<msg.length();i++){checkSum += msg.charAt(i);}}return checkSum;}

如下述代码所示,经过进一步分析后,C2 会注意到,只有对m_ptr指向的对象进行写入,没有代码从中读取。这一观察结果以及有关对象类的一些其他信息意味着此对象分配是不必要的,因此可以将其删除!

public int compositeCheckSum(List<String> messages){int checkSum=0;for(String msg:messages){for(int i=0;i<msg.length();i++){checkSum += msg.charAt(i);}}return checkSum;
}

对象分配移除之所以可行,是因为在某个时刻没有代码从该对象读取数据。标量替换是一种优化,它用直接使用最后写入对象字段的语句(或值)来替换对象字段的加载。还有其他优化可以达到同样的效果,但它们通常适用于简单的代码片段,例如此示例方法。然而,标量替换可以更彻底地“查看”方法并找到可以简化这些对象字段写入的点。

3.总结

总之,标量替换是 OpenJDK 中的一项关键优化技术,可将复杂的对象实例转换为更简单的标量变量,以提高运行时性能。通过消除堆分配的需要并减少内存开销,标量替换可显著提高执行速度和资源效率。

相关文章:

OpenJDK优化技术之标量替换(Scalar Replacement)

标量替换 (SR) 是 OpenJDK 中一项强大的优化技术&#xff0c;旨在通过将复杂对象分解为更简单、更易于管理的标量变量来提高 Java 应用程序的性能。 1.前言 OpenJDK JVM 有两个即时编译器&#xff0c;C1 和 C2。C2 是一种应用许多优化来生成非常高效的编译版本程序的编译器。…...

优思学院|研发工程师获取六西格玛证书有用吗?

在现代的工业领域中&#xff0c;研发工程师不仅需要具备强大的技术能力&#xff0c;还需要掌握有效的管理方法&#xff0c;以确保产品的高质量和高效开发。六西格玛&#xff08;Six Sigma&#xff09;作为一种系统的质量管理方法&#xff0c;已经被广泛应用于各种行业。对于研发…...

C++第二十二弹---vector深度剖析及模拟实现(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、容量操作 2、内容修改操作 3、打印函数 4、迭代器失效 4.1、什么是迭代器失效 4.2、哪些操作会引起迭代器失效 总结 1、容量操作 size()…...

GD32F470+lwip 丢包问题分析及解决

最近在用GD32和管理机之间用TCP协议开发一个功能&#xff0c;功能都没问题&#xff0c;后面跑大量发包时候的连续测试时&#xff0c;总是会出现偶发性的&#xff0c;大概几分钟到数十分钟的一次丢包。尽管在应用层做了超时机制&#xff0c;一旦超时就会重新建立socket链接并重新…...

好用的电子杂志制作平台分享

随着数字媒体的发展&#xff0c;电子杂志逐渐成为了一种流行的新媒体形式。它不仅能够吸引读者的眼球&#xff0c;还能够帮助创作者展示自己的才华。现在&#xff0c;许多电子杂志制作平台应运而生&#xff0c;让创作者可以轻松地制作出高质量的作品。 今天就给大家推荐一款好用…...

“云原生安全:构建弹性且安全的云上环境的关键要素“

云原生安全是指在设计和实施云原生应用时&#xff0c;从一开始就将安全性融入到每一个环节&#xff0c;确保云环境既具备弹性又安全可靠。构建一个既弹性又安全的云上环境&#xff0c;关键要素包括以下几个方面&#xff1a; 1. 微服务架构&#xff1a;采用微服务架构可以提高系…...

燃气安全阀检验维修:守护家庭安全的必备知识

燃气作为现代生活中不可或缺的重要能源&#xff0c;其安全使用直接关系到人民群众的生命财产安全。 燃气安全阀作为保障燃气系统安全运行的关键部件&#xff0c;一旦发生泄露&#xff0c;必须迅速采取有效措施进行排查、检验、维修&#xff0c;并建立长效机制进行预防和维护。…...

【JavaEE】多线程(1)

&#x1f386;&#x1f386;&#x1f386;个人主页&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;JavaEE专栏&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;计算机是怎么工作的&#x1f386;&#x1f3…...

相对位姿估计

相对位姿估计 示意图 理论推导 离线数据库&#xff1a; P的位置 P [ X , Y , Z ] T P[X,Y,Z]^{T} P[X,Y,Z]T 相机内参 k 1 k_{1} k1​ 安卓手机&#xff1a; 相机内参 k 2 k_{2} k2​ 两个像素点位置 &#xff1a; p 1 和 p 2 p_1和p_2 p1​和p2​ 公式一&#xff1a;…...

记一次 .NET某工业设计软件 崩溃分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他的软件在客户那边不知道什么原因崩掉了&#xff0c;从windows事件日志看崩溃在 clr 里&#xff0c;让我能否帮忙定位下&#xff0c;dump 也抓到了&#xff0c;既然dump有了&#xff0c;接下来就上 windbg …...

2020 6.s081——Lab5:Lazy page allocation

再来是千年的千年 不变是眷恋的眷恋 飞越宇宙无极限 我们永不说再见 ——超兽武装 完整代码见&#xff1a;SnowLegend-star/6.s081 at lazy (github.com) Eliminate allocation from sbrk() (easy) 顾名思义&#xff0c;就是去掉sbrk()中调用growproc()的部分。1s完事儿。 Laz…...

华为认证学习笔记:生成树

以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路&#xff0c;引发广播风暴以及MAC地址表不稳定等故障现象&#xff0c;从而导致用户通信质量较差&#xff0c;甚至通信中断。为解决交换网络…...

leetcode 97.交错字符串

思路&#xff1a;LCS 其实也是同一个类型的题目&#xff0c;一般涉及到这种子序列的字符串问题的时候&#xff0c;状态的设置基本上都应该是以...结尾为状态的。这里同样&#xff0c;设置用dp[i][j]为s1,s2字符以i&#xff0c;j结尾能否拼接成s3[ij]。 那么&#xff0c;首先就…...

The Missing Semester ( Shell 工具和脚本 和 Vim)

管道符号 &#xff08;1&#xff09;管道符号 | 将前一个命令的输出作为下一个命令的输入 例如&#xff1a; 以下为 ./semester输出中提取包含 "Last-Modified" 的行并写入文件 last-modified.txt./semester | grep "Last-Modified" > ~/last-modif…...

【Uniapp微信小程序】自定义水印相机、微信小程序地点打卡相机

效果图 template 下方的image图片自行寻找替换&#xff01; <template><view><camerav-if"!tempImagePath && cameraHeight ! 0":resolution"high":frame-size"large":device-position"device":flash"f…...

SimPO: Simple Preference Optimization with a Reference-Free Reward

https://github.com/princeton-nlp/SimPO 简单代码 class simpo(paddle.nn.Layer):def __init__(self):super(OrPoLoss, self).__init__()self.loss paddle.nn.CrossEntropyLoss()def forward(self,neg_logit, neg_lab, pos_logit, pos_lab,beta,gamma):neg_logit paddle.n…...

CDH6.3.2安装文档

前置环境&#xff1a; 操作系统&#xff1a; CentOS Linux release 7.7 java JDK &#xff1a; 1.8.0_231 1、准备工作 准备以下安装包&#xff1a; Cloudera Manager: cloudera-manager-agent-6.3.1-1466458.el7.x86_64.rpm cloudera-manager-daemons-6.3.1-1466458.el…...

Java实战入门:深入解析Java中的 `Arrays.sort()` 方法

文章目录 一、方法定义参数说明返回值 二、使用场景三、实现原理四、示例代码示例一&#xff1a;对整型数组排序示例二&#xff1a;对字符串数组排序示例三&#xff1a;对自定义对象数组排序 五、注意事项六、总结 在Java编程中&#xff0c;Arrays.sort() 方法是一个非常常用的…...

JavaScript的垃圾回收机制

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、垃圾…...

小程序使用Canvas设置文字竖向排列

在需要使用的js页面引入js文件,传入对应参数即可 /** * 文本竖向排列 */ function drawTextVertical(context, text, x, y) {var arrText text.split();var arrWidth arrText.map(function (letter) {return 26; // 字体间距,需要自定义可以自己加参数,根据传入参数进行…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...