java 编程 7个简单的调优技巧

你的Java性能调优有救了!分享7个简单实用的Java性能调优技巧
一、以编程方式连接字符串
在Java中有很多不同的连接字符串的选项。比如,可以使用简单的+或+=、良好的旧StringBuffer或StringBuilder。
那么,应该选择哪种方法?
答案取决于连接字符串的代码。如果以编程方式向字符串添加新内容,例如在for循环中,则应使用StringBuilder。它相对而言易于使用,并拥有比StringBuffer更好的性能。但注意了,与StringBuffer相比,StringBuilder不是线程安全的,可能不适合所有用例。
只需要实例化一个新的StringBuilder并调用append方法向字符串中添加一个新的部分,添加完成后,可以调用toString()方法来检索连接的字符串。
下面举一个简略的例子。在每次迭代期间,这个循环将i转换为一个String,并将它与一个空格一同增加到StringBuilder sb中。最终,这段代码将在日志文件中写入“This is a test0 1 2 3 4 5 6 7 8 9”。
StringBuilder sb = newStringBuilder(“This is a test”);
for (int i=0; i<10; i++) {
sb.append(i);
sb.append(”“);
}
log.info(sb.toString());
如代码中所示,能够将String的第一个元素供给结构办法。这将创立一个新的StringBuilder,新的StringBuilder包括供给的String和16个额定字符的容量。当你向StringBuilder增加更多字符时,JVM将动态增加StringBuilder的巨细。
如果你已经知道字符串将包含多少个字符,则可以将该数字提供给不同的构造函数方法,以实例化具有定义容量的StringBuilder。这将进一步提高其效率,因为它不需要动态扩展其容量。
二、使用+在一条语句中连接字符串
当你用Java完成你的第一个运用程序时,可能有人告诉你不该用+来衔接String。但如果你是在运用程序逻辑中衔接字符串,这就没啥问题了。
字符串是不可变的,每个字符串的衔接成果都存储在一个新的String目标中。这需求额定的内存,会减慢你的运用程序,特别是如果你在一个循环内衔接多个字符串的话。
在这些状况下,你应该遵从上个技巧并运用StringBuilder。但如果你只是将一个字符串拆分为多行以提高代码的可读性,那状况就不一样了。
Query q = em.createQuery(“SELECTa.id, a.firstName, a.lastName ”
+ “FROMAuthor a ”+ “WHEREa.id = :id”);
在这些情况下,你应该使用简单的+连接字符串。Java编译器将对此进行优化,并在编译时执行连接。因此,在运行时,你的代码将只使用1个字符串,不需要串联。
三、尽可能使用Primitives
另一种避免任何开销并提高应用程序性能的快速简便方法是使用Primitives而不是它们的包装类。
所以,最好用int代替整数,或者用double代替double。这允许JVM将值存储在堆栈中而不是堆中,以减少内存消耗并更有效地处理它。
四、避免使用BigInteger
BigInteger和BigDecimal比简单的long或double需要更多的内存,大大降低了所有计算的速度。
因此,如果你需要额外的精度,或者如果你的数字将超过一个很长的范围,最好三思而后行。这可能是解决性能问题所需的唯一更改,尤其是在实现数学算法的情况下。
五、首先检查当前日志级别
在创建调试消息之前,应始终首先检查当前日志级别。否则,你可能会在日志消息中创建一个字符串,该字符串将在以后被忽略。

这里有两个不同的例子。
// don’t do this
log.debug(“User [” + userName + “] called method X with [” + i + “]”);
// or this
log.debug(String.format(“User [%s] called method X with [%d]”, userName, i));
在上面两种状况中,你都将在不知道日志结构是否将运用日志音讯的前提下,履行创立日志音讯一切必需的过程。因此在创立调试音讯之前,最好先查看当时的日志等级。
六、使用 StringUtils.Replace方法
如果你的应用程序需要大量替换操作,并且你还没有更新到最新的Java版本,那么检查更快、更高效的替代方案是有必要的。一个候选方法是Apache Commons Lang的StringUtils.replace方法,它的性能显著优于Java8的String.replace方法。
你需要将Apache的Commons Lang项目的Maven依赖项添加到应用程序pom.xml中,并将String.replace方法的所有调用替换为StringUtils.replace方法。
七、缓存昂贵的资源
缓存是一种流行的解决方案,可以避免重复执行昂贵或频繁使用的代码段。总的想法很简单:重用这样的资源比一次又一次地创建新资源要便宜。
一个典型的例子是在池中缓存数据库连接。创建新连接需要时间,如果重用现有连接,可避免这一点。还可以在Java语言本身中找到其他示例,比如,Integer类的valueOf方法缓存-128和127之间的值。可能创建一个新的整数并不贵,但它的使用非常频繁,因此缓存最常用的值可以提供性能优势。
但是当你考虑缓存时,请记住缓存实现也会产生开销。你需要花费额外的内存来存储可重用资源,并且可能需要管理缓存以使资源可访问或删除过时的资源。因此,在开始缓存任何资源之前,请确保使用它们的频率足以超过缓存实现的开销。
如你所见,有时并不需要做很多工作来提高应用程序的性能,小编这里的大多数建议只需要一点额外的努力就可以将它们应用到你的代码中。
今天的分享就到这里了,还在等什么?快点收藏起来运用到你代码中试试吧!
相关文章:
java 编程 7个简单的调优技巧
你的Java性能调优有救了!分享7个简单实用的Java性能调优技巧 一、以编程方式连接字符串 在Java中有很多不同的连接字符串的选项。比如,可以使用简单的或、良好的旧StringBuffer或StringBuilder。 那么,应该选择哪种方法? 答案取…...
03-Dockerfile
Dockerfile简介 Dockerfile是什么? Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本 Dockerfile官网 https://docs.docker.com/engine/reference/builder/ Dockerfile构建三步曲 编写Dockerfile文件docke…...
【AI】机器学习——朴素贝叶斯
文章目录 2.1 贝叶斯定理2.1.1 贝叶斯公式推导条件概率变式 贝叶斯公式 2.1.2 贝叶斯定理2.1.3 贝叶斯决策基本思想 2.2 朴素贝叶斯2.2.1 朴素贝叶斯分类器思想2.2.2 条件独立性对似然概率计算的影响2.2.3 基本方法2.2.4 模型后验概率最大化损失函数期望风险最小化策略 2.2.5 朴…...
数学建模:模糊综合评价分析
🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 数学建模:模糊综合评价分析 文章目录 数学建模:模糊综合评价分析综合评价分析常用评价方法一级模糊综合评价综合代码 多级模糊综合评价总结 综合评价分析 构成综合评价类问题的五个…...
智能小车—PWM方式实现小车调速和转向
目录 1. 让小车动起来 2. 串口控制小车方向 3. 如何进行小车PWM调速 4. PWM方式实现小车转向 1. 让小车动起来 电机模块开发 L9110s概述 接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,具体根据实际调试 IA1输入高电平,…...
Getx其他高级API
// 给出当前页面的args。 Get.arguments//给出以前的路由名称 Get.previousRoute// 给出要访问的原始路由,例如,rawRoute.isFirst() Get.rawRoute// 允许从GetObserver访问Rounting API。 Get.routing// 检查 snackbar 是否打开 Get.isSnackbarOpen// 检…...
npm/yarn link 测试包时报错 Warning: Invalid hook call. Hooks can only be called ...
使用 dumi 开发 React 组件库时,为避免每次修改都发布到 npm,需要在本地的测试项目中使用 npm link 为组件库建立软连接,方便本地调试。 结果在本地测试项目使用 $ npm link 组件库 后,使用内部组件确报错: react.dev…...
「网页开发|前端开发|Vue」06 公共组件与嵌套路由:让每一个页面都平等地拥有导航栏
本文主要介绍在多个页面存在相同部分时,如何提取公共组件然后在多个页面中导入组件重复使用来减少重复代码。在这基础上介绍了通过嵌套路由的方式来避免页面较多或公共部分较多的情况下,避免不断手动导入公共组件的麻烦,并且加快页面跳转的速…...
leetcode687. 最长同值路径(java)
最长同值路径 题目描述DFS 深度遍历代码演示 题目描述 难度 - 中等 LC - 687. 最长同值路径 给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之…...
MySQL的常用术语
目录 1.关系 2.元组 3.属性 MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 1.关系 前面的博客有说到,MySQL是一款关系型数据库管理软件,一个关系就是 一张二维表(表) 我想大家都知道表格怎么…...
机器学习的特征工程
字典特征提取 def dict_demo():"""字典特征提取:return:"""data [{city: 北京, temperature: 100}, {city: 上海, temperature: 60}, {city: 深圳, temperature: 30}]# data [{city:[北京,上海,深圳]},{temperature:["100","6…...
python3 修改nacos的yaml配置
一、安装nacos库 pip install nacos-sdk-python 二、代码如下 import nacos import yaml# 连接地址 NACOS_SERVER_ADDRESSES "192.168.xx.xx" NACOS_SERVER_PORT 替换为你的端口号,如8848# 命名空间 NACOS_NAMESPACE "your_namespace"# 账…...
YOLOv8 : 数据组织
1. 数据源 首先YOLOv8是支持目标分类、检测和目标分割。当前以应用最为广泛的目标检测为例,简单说明数据相关的信息。 一般情况下,建议将数据划分成images和labels,其中images存储图像,labels存储标签文件(YOLO格式)。如果是VOC数…...
golang如何生成zip压缩文件
在Golang中,您可以使用标准库中的compress/zip包来生成ZIP压缩文件。下面是一个简单的示例代码,演示如何使用该包来创建一个ZIP文件并将文件添加到其中: package main import ( "archive/zip" "bytes" "fmt&qu…...
AntDesign技术指南:构建优雅的前端界面
引言 AntDesign是一款优秀的前端UI组件库,它提供了丰富的组件和功能,帮助我们快速构建漂亮、易用的前端界面。本篇博客将详细介绍AntDesign的使用方法和技巧,并展示完整的代码示例。无论你是初学者还是有经验的开发者,本篇博客都…...
机器人任务挖掘与智能超级自动化技术解析
本文为上海财经大学教授、安徽财经大学学术副校长何贤杰出席“会计科技Acctech应对不确定性挑战”高峰论坛时的演讲内容整理。何贤杰详细介绍了机器人任务挖掘与智能超级自动化技术的发展背景、关键技术和应用场景。 从本质来说,会计是非常适合智能化、自动化的。会…...
C#通过ModbusTcp协议读写西门子PLC中的浮点数
一、Modbus TCP通信概述 MODBUS/TCP是简单的、中立厂商的用于管理和控制自动化设备的MODBUS系列通讯协议的派生产品,显而易见,它覆盖了使用TCP/IP协议的“Intranet”和“Internet”环境中MODBUS报文的用途。协议的最通用用途是为诸如PLC,I/…...
19-springcloud(中)
一 服务注册发现 1 什么是服务治理 为什么需要服务治理 在没有进行服务治理前,服务之间的通信是通过服务间直接相互调用来实现的。 过程: 武当派直接调用峨眉派和华山派,同样,华山派直接调用武当派和峨眉派。如果系统不复杂,这样…...
Leetcode1090. 受标签影响的最大值
思路:根据值从大到小排序,然后在加的时候判断是否达到标签上限即可,一开始想用字典做,但是题目说是集合却连续出现两个8,因此使用元组SortedList进行解决 class Solution:def largestValsFromLabels(self, values: li…...
第七章:敏捷开发工具方法-part2-CI/CD工具介绍
文章目录 前言一、CI-持续集成1.1 安装部署gitlab 二、gitlab CI配置三、jenkins实现CI / CD3.1 安装jenkins3.2 配置CI3.3 配置CD3.4 其他构建方式1、定时构建2、指定参数构建3、webhook自动根据git事件进行构建 前言 什么是CI/Cd? CI-Continuous integration&…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
