j2ee项目Java代码性能优化要点(抄书)
亚信联创科技出版的。
1、与log4j有关的性能问题
Logger对象的标准定义方式:
private static transient Logger log=Logger.getLogger(createIndex.class); static:创建一次logger对象,节省开销
transient:避免被序列化,减少序列化开销
使用 debug 函数的标准方式:
if ( log.isDebugEnable()) { // 一定要记得先判 g debug 开关
Log.debug(“ G DEBUG 调试信息” );
}
原因:
没错,确实可通过配置 s log4j.properties 来控制某类路径下的 g debug 开关是否开启 , ,
但不要忽略在调 g debug 函数前,准备形参的开销。
例如:
Dataset datas = ServiceFactory.call(“ QCS_QueryUserInfo”, ...);
Log.debug(“ 输入参数:” + datas); / // 这里会调datas 的 toString ,相当消耗时间
不要图省事包装一下 , 提供通用 API, , 因为你没解决上面提到的形参准备开销问题 , 比如 :
/**
* 错误的使用方式
*/
public static void debug(String ) xxx) {
if (log.isDebugEnable()) {
log.log(xxx);
}
}
使用debug部分不是很懂!
2、与字符串有关的性能问题
1)尽量不要使用java.lang.String中提供的split、replace、replaceAll等方法。
原因:
JDK中是用正则表达式做匹配的,在频繁使用的场景下,对性能影响很大。
建议使用org.apache.commons.lang.StringUtils中提供的split、replaceChars,是JDK性能的3~4倍。
2)尽量用StringBuilder替代StringBuffer
原因:
StringBuffer是线程安全,速度比较慢
StringBuilder的append()方法尽量多次append而不是sb.append("a"+"b");
原因:
这样又变成字符串的拼接了
在构建StringBuilder的时候,如果可以最好预估容量。
StringBuilder sb=new StringBuilder();
原因:
防止StringBuilder因为预先分配的容量不够而做第二次扩充。
3、与时间有关的性能问题
避免重复构建SimpleDateFormat对象,SimpleDateFormat对象创建的开销很大。
避免复用SimpleDateFormat对象,因为SimpleDateFormat对象是不可重用的,和C中的不可复用函数一个意思。
错误的使用方式:
SimpleDateFormat sdf=new SimpleDateformat("yyyy-MM-dd");
for(...){
//定义一次使用多次
sdf.format(new Date());
}
建议使用apache提供的:org.apache.commons.lang.time.DateFormatUtils.
这个SimpleDateformat是不可重用的吗?我不清楚啊,没百度到结果。不管。
4、与for循环有关的性能问题
避免条件判断时调用函数:
错误的方式:
for(int i=;i<arr.length;i++){
...
}
应该写成这样最好:
for(int i=,len=arr.length;i<len;i++){
...
}
try...catch要放在循环外面。
避免在循环中反复调用同一个结果集的同一个对象:
不建议:
for(int i=;i<datas.size();i++){
String distCode=datas.getData(i).getString("Code");
String distName=datas.getData(i).getString("Name");
String explain=datas.getData(i).getString("explain");
...
}
建议:
for(int i=,size=datas.size();i<size;i++){
Data data=datas.getData(i);
String distCode=data.getString("Code");
String distName=data.getString("Name");
String explain=data.getString("explain");
...
}
5、与集合有关的性能问题
能用ArrayList就尽量不要用Vector
原因:
Vector线程安全,慢
能用hashMap就不要用HashTable
原因:
hashtable线程安全
在使用容器时尽量预设容量,防止扩充的消耗。
new ArrayList();
6、与开关有关的性能问题
无论框架开关还是业务开关,到Java后端最好保存为boolean类型。
不建议的方式:
if("true".equals(validate)){
...
}
建议的方式:
if(validate){
...
}
原因:
前者的开销是后者的几十倍,字符串越长,开销越大
7、与工具方法有关的性能问题
将小工具函数标识为final
public static final boolean isBlank(String str){
if(str==null || "".equals(str.trim())){
return true;
}
return false;
}
原因:
JDK在运行一定次数后JIT可能将此final类型的函数关联
8、与sql动态绑定有关的性能问题。
能使用preparedStatement就不使用statement对象
原因:
两者的差别就在于编译型语言和脚本语言的差别。
9、与反射调用有关的性能问题
尽量缓存method对象,method对象是反射最消耗性能的地方。
10、缓存使用的性能问题
缓存的作用有两个:
将你需要的数据搬到离你更近的地方
缓存计算
避免从缓存获取数据后再对数据进行排序过滤等操作,正确的做法是先将数据排序过滤好,再放入缓存。
11、并发锁带来的问题
最好是不用锁,比如cas机制解决并发问题
//正确的计数器写法
private static AutomicInteger count=newAutomicInteger(); public void xxx(){
//业务处理
count.getAndIncrement(); } //不建议的计数器写法:
private static int count=; public void synchronized xxx(){
count++;
}
在读多写少的情景下,用读写锁,不要用排他锁,比如synchronized
12、杂谈
避免频繁使用instanceof做类型判断,建议拆成多个对象,用多态调用。
能不用正则表达式就不用正则表达式,正则表达式只是更灵活,但特定场景下性能不一定最优
避免重复对象的反复构造,能复用就复用
两数组对拷,注意使用System.arraycopy不要自己写for循环,性能差距非常大
j2ee项目Java代码性能优化要点(抄书)的更多相关文章
- 35 个 Java 代码性能优化总结
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...
- Java 代码性能优化总结
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...
- Java代码性能优化总结
代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...
- Java 代码性能优化
代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...
- 小细节,大用途,35 个 Java 代码性能优化总结!
前言: 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用 ...
- 来自极客头条的 35 个 Java 代码性能优化总结
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...
- 不得不看的Java代码性能优化总结
原文:https://blog.csdn.net/mr_smile2014/article/details/50112723 前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么 ...
- Java代码性能优化的 39个细节
在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1:在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提 ...
- 35个java代码性能优化。。转
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑 的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用 ...
随机推荐
- VS2015 定位内存泄漏工具vld
介绍一款在vs2015开发环境定位内存泄漏工具:Visual Leak Detector ,具体的使用方法如下: 1. 安装vld-2.5-setup.exe (下载链接地址后面会给出),安装过程会 ...
- JS批量获取参数构建JSON参数对象
在做系统的时候,往往查询条件是被严格指定的,大量的查询条件,一两个页面还可以通过dom去一个一个获取,再构建参数对象,请求后台接口. 这里给大家讲一个批量获取前端参数,构建参数对象. <form ...
- C#高级编程---暂停计划
学了两个半月的C#高级编程这本书,看到了第三部分,说实话,我有点怂了,我认怂,临时先放一下,博客暂停,由于我的水平确实不会了,在写下去也是自欺欺人,我决定先研究研究我比較喜欢的脚本语言JS,開始写的, ...
- git 操作分支
1. git 查看本地分支:git branch 2. git 查看所有分支:git branch -a 3. git 新建本地分支:git branch branchName 4. git 新建分支 ...
- Spring学习十二----------Bean的配置之@ImportResource和@Value
© 版权声明:本文为博主原创文章,转载请注明出处 @ImportResource -引入XML配置文件 @Value -从配置文件中获取值 实例 1.项目结构 2.pom.xml <projec ...
- IOS研究之网络编程(二)-Cocoa Streams使用具体解释
本文以及相关的系列文章是我总结的iOS网络开发方面的知识点,本文是第二篇,主要分析了Cocoa Streams中的几个重要类 Cocoa Streams实际上是Objective-C对CFNet ...
- ASP.NET页面间传值的几种方式
ASP.NET页面间传值的几种方式 1.使用QueryString 使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在 ...
- Echache整合Spring缓存实例解说
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCac ...
- rtsp转rtmp、hls网页直播服务器EasyNVR前端兼容性调试:ie下的 pointer-events- none
发现问题: 之前在做EasyNVR 的web页面开发过程中,力求的都是一个播放效果的.功能的展示.对于兼容性也有注意,但有些细节还是难免有所疏忽. 内部测试发现:由于我们是流媒体的实时视频直播,在we ...
- JS之字符串与JSON转换
JS之字符串转换JSON 1.eval 古老的方式 function strToJson(str){ var json = eval('(' + str + ')'); return json; ...