java代码调优

调优目标:

java代码调优,首先明确调优目的是什么,如下摘自网上

‍1) 运算的性能——看哪一个算法的执行性能最好?

2) 内存的分配——程序运行时需要耗费多少内存?
3) 启动的时间——程序启动需要多长时间?
4) 程序的可伸缩性——在压力负载的情况下,程序的性能如何?
5) 性能的感知——用户在什么情况下会觉得程序的性能不好?
在开始调优之前,应明确不优代码的理由。前面两项可以用一些软件进行分析。‍jprofiler是个不错的工具。JProbe也不错。Jmeter, OpenSTA,loadrunner.
调优的步骤:
一般我们提高应用程序的性能划分为以下几个步骤:
1) 明确应用程序的性能指标,怎样才符合期望的性能需求;
2) 在目标平台进行测试;
3) 如果性能已经达到性能指标就不用优化了;
4) 查找性能瓶颈;
5) 修改性能瓶颈;
6) 返回到第2步。
调优法则:

1、空间换时间法则 把常用的缓存起来

2、以时间换空间法则 比如用一些简单的数据结构进行复杂逻辑的计算。

3、循环法则

大部分稍微有点经验的人不会在同一个函数中循环两次同样的变量,但是仅限于同一个函数,假如在一个函数里调用了另外一个函数,那么就不一定了,很多人为了看似解耦的一个操作,在两个函数对同一个变量做了多次的循环。循环法则有几个比较经典细则:
第一、将代码移除循环,这是最容易想到的,当然,可以移除的条件是,每次循环都执行同样的某次操作。
第二、合并测试条件,高效的内循环应该包含尽量少的测试条件,最好只有一个,因此,程序员尽量用一些退出条件来模拟循环的其他退出条件。
第三、哨兵法则,在数据结构边界上放一个哨兵以减少测试是否已经搜索结束的开销。
第四、展开循环,展开循环可以减少修改循环下标的开销,对于避免管道延迟,减少分支以及增加指令级的并行性也有很大帮助。
第五、删除赋值,赋值的开销实际上在整个程序的执行过程中占的开销可以忽略不计,但假如你要在一个循环十万次的循环中赋值,那么开销就不能不计了,尽可能的在循环中减少赋值吧。
第六,消除无条件分支,快速的循环中不应该包含无条件分支,通过旋转循环,在底部加上一个条件分支,能够消除循环结束处的无条件分支。
第七、循环合并,如果你不小心做了傻事,那么合并两个对同一个变量循环操作吧

4、逻辑法则
利用等价的代数表达式。如果逻辑表达式的求值开销太大就将其替换为开销较小的等价代数表达式。
短路单调函数。如果我们想测试几个变量的单调非递减函数是否超过了某个特定的阈值,那么一旦达到这个阈值就不在需要计算任何变量了。
对测试机条件重新排序。在组织逻辑测试的时候,应该是降低开销的,经常成功的测试放在高开销的,很少成功的测试前面。

5、过程法则
打破函数层次。对于(非递归地)调用自身的函数,通常可以通过将其改写为内联版本并固定传入的变量来缩短其运行时间。
并行性。在底层硬件条件下,我们构建的程序应该尽可能多的挖掘并行性。

6、表达式法则
编译时初始化。在程序执行前,应该尽可能多的变量初始化。
利用等价的代数表达式。如果表达式的求值开销过大,就将其替换为开销更小的等价的代数表达式,比如换一种算法
消除公共子表达式。如果两次对同一个表达式求值,其所有变量都没有任何改动,那么我们可以用下面方法避免二次求值:存储第一次的计算结果并用其取代第二次求值。

一般应用程序的调优:

从运算性能上,如果方法运行时间过长,考虑用更优化的算法。

从内存的分配上,减少具部对象的过多创建。

考虑不同数据类型对性能的影响,如ArryList和Vector, HashMap 和HashTable, String 和StringBuffer

servlet的优化:

性能上考虑用Cache

内存上减少session的使用,一般不要把大对象放在Session里

Jsp优化:

用jsp:include进行预编译

用cahce对常用代码片段进行缓存。

数据库优化:

用数据池而不是数据连接。

时时关闭不用的资源连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值