十四 对于boolean值 避免不必要的等式判断
将一个boolean值与一个true比较是一个恒等 *** 作(直接返回该boolean变量的值) 移走对于boolean的不必要 *** 作至少会带来 个好处
)代码执行的更快 (生成的字节码少了 个字节)
)代码也会更加干净
例子
public class UEQ
{
boolean method (String string) {
return string endsWith ( a ) == true; // Violation
}
}
更正
class UEQ_fixed
{
boolean method (String string) {
return string endsWith ( a );
}
}
十五 对于常量字符串 用 String 代替 StringBuffer
常量字符串并不需要动态改变长度
例子
public class USC {
String method () {
StringBuffer s = new StringBuffer ( Hello );
String t = s + World! ;
return t;
}
}
更正
把StringBuffer换成String 如果确定这个String不会再变的话 这将会减少运行开销提高性能
十六 用 StringTokenizer 代替 indexOf() 和 substring()
字符串的分析在很多应用中都是常见的 使用indexOf()和substring()来分析字符串容易导致StringIndexOutOfBoundsException 而使用StringTokenizer类来分析字符串则会容易一些 效率也会高一些
例子
public class UST {
void parseString(String string) {
int index = ;
while ((index = string indexOf( index)) != ) {
System out println (string substring(index string length()));
}
}
}
参考资料
Graig Larman Rhett Guthrie: Java Performance and Idiom Guide
Prentice Hall PTR ISBN: pp –
十七 使用条件 *** 作符替代 if (cond) return; else return; 结构
条件 *** 作符更加的简捷
例子
public class IF {
public int method(boolean isDone) {
if (isDone) {
return ;
} else {
return ;
}
}
}
更正
public class IF {
public int method(boolean isDone) {
return (isDone : );
}
}
十八 使用条件 *** 作符代替 if (cond) a = b; else a = c; 结构
例子
public class IFAS {
void method(boolean isTrue) {
if (isTrue) {
_value = ;
} else {
_value = ;
}
}
private int _value = ;
}
更正
public class IFAS {
void method(boolean isTrue) {
_value = (isTrue : ); // pact expression
}
private int _value = ;
}
十九 不要在循环体中实例化变量
在循环体中实例化临时变量将会增加内存消耗
例子
import java util Vector;
public class LOOP {
void method (Vector v) {
for (int i= ;i < v size();i++) {
Object o = new Object();
o = v elementAt(i);
}
}
}
更正
在循环体外定义变量 并反复使用
import java util Vector;
public class LOOP {
void method (Vector v) {
Object o;
for (int i= ;i<v size();i++) {
o = v elementAt(i);
}
}
}
二十 确定 StringBuffer的容量
StringBuffer的构造器会创建一个默认大小(通常是 )的字符数组 在使用中 如果超出这个大小 就会重新分配内存 创建一个更大的数组 并将原先的数组复制过来 再丢弃旧的数组 在大多数情况下 你可以在创建StringBuffer的时候指定大小 这样就避免了在容量不够的时候自动增长 以提高性能
例子
public class RSBC {
void method () {
StringBuffer buffer = new StringBuffer(); // violation
buffer append ( hello );
}
}
更正
为StringBuffer提供寝大小
public class RSBC {
void method () {
StringBuffer buffer = new StringBuffer(MAX);
buffer append ( hello );
}
private final int MAX = ;
}
参考资料
Dov Bulka Java Performance and Scalability Volume : Server Side Programming
Techniques Addison Wesley ISBN: p –
二十一 尽可能的使用栈变量
如果一个变量需要经常访问 那么你就需要考虑这个变量的作用域了 static local还是实例变量?访问静态变量和实例变量将会比访问局部变量多耗费 个时钟周期
例子
public class USV {
void getSum (int[] values) {
for (int i= ; i < value length; i++) {
_sum += value[i]; // violation
}
}
void getSum (int[] values) {
for (int i= ; i < value length; i++) {
_staticSum += value[i];
}
}
private int _sum;
private static int _staticSum;
}
更正
如果可能 请使用局部变量作为你经常访问的变量
你可以按下面的方法来修改getSum()方法
void getSum (int[] values) {
int sum = _sum; // temporary local variable
for (int i= ; i < value length; i++) {
sum += value[i];
}
_sum = sum;
}
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 JAVA程序设计中一个普遍的问题就是没有好好的利用JAVA语言本身提供的函数,从而常常会生成大量的对象(或实例)。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。 例1:关于String,StringBuffer,+和append JAVA语言提供了对于String类型变量的 *** 作。但如果使用不当,会给程序的性能带来影响。如下面的语句: Stringname=newString("HuangWeiFeng");Systemoutprintln(name+"ismyname"); 看似已经很精简了,其实并非如此。为了生成二进制的代码,要进行如下的步骤和 *** 作: (1)生成新的字符串newString(STR_1);(2)复制该字符串; (3)加载字符串常量"HuangWeiFeng"(STR_2);(4)调用字符串的构架器(Constructor);(5)保存该字符串到数组中(从位置0开始); (6)从javaioPrintStream类中得到静态的out变量; (7)生成新的字符串缓冲变量newStringBuffer(STR_BUF_1);(8)复制该字符串缓冲变量; (9)调用字符串缓冲的构架器(Constructor);(10)保存该字符串缓冲到数组中(从位置1开始); (11)以STR_1为参数,调用字符串缓冲(StringBuffer)类中的append方法;(12)加载字符串常量"ismyname"(STR_3); (13)以STR_3为参数,调用字符串缓冲(StringBuffer)类中的append方法;(14)对于STR_BUF_1执行toString命令; (15)调用out变量中的println方法,输出结果。 由此可以看出,这两行简单的代码,就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五个对象变量。这些生成的类的实例一般都存放在堆中。堆要对所有类的超类,类的实例进行初始化,同时还要调用类极其每个超类的构架器。而这些 *** 作都是非常消耗系统资源的。因此,对对象的生成进行限制,是完全有必要的。 经修改,上面的代码可以用如下的代码来替换。 StringBuffername=newStringBuffer("HuangWeiFeng"); Systemoutprintln(nameappend("ismyname")toString()); 系统将进行如下的 *** 作: (1)生成新的字符串缓冲变量newStringBuffer(STR_BUF_1);(2)复制该字符串缓冲变量; (3)加载字符串常量"HuangWeiFeng"(STR_1);(4)调用字符串缓冲的构架器(Constructor);(5)保存该字符串缓冲到数组中(从位置1开始); (6)从javaioPrintStream类中得到静态的out变量;(7)加载STR_BUF_1; (8)加载字符串常量"ismyname"(STR_2); (9)以STR_2为参数,调用字符串缓冲(StringBuffer)实例中的append方法;(10)对于STR_BUF_1执行toString命令(STR_3);(11)调用out变量中的println方法,输出结果。 由此可以看出,经过改进后的代码只生成了四个对象变量:STR_1,STR_2,STR_3和STR_BUF_1你可能觉得少生成一个对象不会对程序的性能有很大的提高。但下面的代码段2的执行速度将是代码段1的2倍。因为代码段1生成了八个对象,而代码段2只生成了四个对象。 代码段1: Stringname=newStringBuffer("HuangWeiFeng");name+="ismy";name+="name"; 代码段2: StringBuffername=newStringBuffer("HuangWeiFeng");nameappend("ismy"); nameappend("name")toString(); 因此,充分的利用JAVA提供的库函数来优化程序,对提高JAVA程序的性能时非常重要的其注意点主要有如下几方面; (1)尽可能的使用静态变量(StaticClassVariables)
如果类中的变量不会随他的实例而变化,就可以定义为静态变量,从而使他所有的实例都共享这个变量。 例: publicclassfoo{ SomeObjectso=newSomeObject();} 就可以定义为:publicclassfoo{ staticSomeObjectso=newSomeObject();} (2)不要对已生成的对象作过多的改变。 对于一些类(如:String类)来讲,宁愿在重新生成一个新的对象实例,而不应该修改已经生成的对象实例。例: Stringname="Huang";name="Wei";name="Feng"; 上述代码生成了三个String类型的对象实例。而前两个马上就需要系统进行垃圾回收处理。如果要对字符串进行连接的 *** 作,性能将得更差,因为系统将不得为此生成更多得临时变量,如上例1所示。 (3)生成对象时,要分配给它合理的空间和大小JAVA中的很多类都有它的默认的空间分配大小。对于StringBuffer类来讲,默认的分配空间大小是16个字符。如果在程序中使用StringBuffer的空间大小不是16个字符,那么就必须进行正确的初始化。 (4)避免生成不太使用或生命周期短的对象或变量。对于这种情况,因该定义一个对象缓冲池。以为管理一个对象缓冲池的开销要比频繁的生成和回收对象的开销小的多。 (5)只在对象作用范围内进行初始化。JAVA允许在代码的任何地方定义和初始化对象。这样,就可以只在对象作用的范围内进行初始化。从而节约系统的开销
第 章 Java性能调优概述
性能概述
看懂程序的性能
性能的参考指标
木桶原理与性能瓶颈
Amdahl定律
设计调优
代码调优
JVM调优
数据库调优
*** 作系统调优
优化的一般步骤
系统优化注意事项
小结
第 章设计优化
善用设计模式
单例模式( )
单例模式( )
单例模式( )
代理模式( )
代理模式( )
代理模式( )
代理模式( )
代理模式( )
代理模式( )
代理模式( )
享元模式( )
享元模式( )
装饰者模式( )
装饰者模式( )
装饰者模式( )
装饰者模式( )
观察者模式( )
观察者模式( )
观察者模式( )
Value Object模式( )
Value Object模式( )
业务代理模式( )
业务代理模式( )
缓冲(Buffer)( )
缓冲(Buffer)( )
缓存(Cache)( )
缓存(Cache)( )
缓存(Cache)( )
对象复用 池 ( )
对象复用 池 ( )
对象复用 池 ( )
对象复用 池 ( )
对象复用 池 ( )
并行替代串行
负载均衡( )
负载均衡( )
负载均衡( )
负载均衡( )
时间换空间
空间换时间
小结
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
J ME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
lishixinzhi/Article/program/Java/gj/201311/27852
很多企业开通了小程序,但是流量寥寥无几,那么大家来问了小程序是像网站一样需要SEO吗?怎样能提高小程序的访问量?
实际上,越来越多的小程序诞生,小程序多了就需要搜索,那么如何让自己的小程序在众多的小程序中脱颖而出,这就需要小程序SEO优化。小马识途营销顾问告诉大家,微信小程序要靠微信搜索带来流量访问,这个过程虽不同于传统的seo,但其道理是大同小异的,只不过小程序不像网站那样可优化的空间比较大。
小马识途顾问在运营实践中梳理出了一系列的小程序优化经验,分享一些要点给大家。现阶段,小程序主要有三大流量入口,我把它分为三种类型
1:被动型搜索、附近的小程序 、用户分享
2:主动型公众号关联、门店二维码、文章群发、小程序 跳转
3:推广付费竞价排名、区域投放、公众号广点通
对于被动型的流量入口,我们可以在尽量少花钱的情况下可以做到的小程序排名优化,在说小程序优化之前,先和大家说一下小程序的搜索排名规则。
1:第一优先级——使用过的小程序
2:第二优先级——上线时间早的小程序
3:小程序的名字
4:小程序关键词被搜索的频率
5:小程序的使用次数
那么,对于小程序优化,我们应该从哪些方面去着手呢?小马识途营销顾问建议从以下几点入手:
一、注册时间
从搜索的角度来说,目前对于小程序的大多数热词, 越早注册的小程序排名越靠前,被人检索使用的几率就越高,小程序的排名就会越靠前 。所以,对于那些对小程序有需求,但是又不想过多投入的朋友来说,就需要赶早注册一个与行业相对应的小程序了,因为,第一个吃螃蟹的人,总能得到最美味的。
二、小程序名字
小程序的名字非常重要,它具有 唯一性 , 一个好的名字直接决定了小程序被用户搜索到的概率 。举个例子:比如你想要装修房子,想通过小程序找一家装修公司,之前并没有用过这样的小程序,怎么办?
大多数的人会选择微信搜一搜,怎么搜?数据显示超过一半的人会直接输入地区+装修公司,而不是直接去搜索某一家的装修公司,除非是对这家公司特别的熟悉,所以说,提前抢注名字就非常重要了,地区+装修公司如果被人注册了,其他公司就无法使用了,流量很容易就被截走。
小程序的名字除了和业务相关,便于审核通过之外,建议选择1—2个指数高的词组合命名,需要注意的是名称太长不易于审核和被搜索到。
另外,小马识途顾问提示小程序名称注册时需要注意以下三个方面:
1:小程序名称唯一,且不可与不同主体的公众号重名。
2:小程序的名字不可以 以特殊字符来命名。
3:小程序的名字和简介、描述中,不得混有商业化用语、热门微信小程序名字、“国家级”、“最高级”等新广告法明令禁止或其他无关的词语
三、关键词
这是小程序推广优化最重要的因素, 在小程序后台的推广模块中可配置最多10个关键词,并且支持每个月修改三次,审核时间为7天。
需要注意的是,只有已经发布过正式版本的小程序可以使用这一功能,门店小程序暂不支持这一功能。
从关键词本身来说,有品牌词、竞品词、产品词、人群词、行业词之分,我们的目的是尽最大可能性截取关键词搜索流量。
首先 ,我们要分析自身的核心用户群体,即描绘用户画像。例如在家政行业,用户的搜索习惯,多以“保姆”、“维修”、“搬家”、“保洁”等词语为主,而不会直接去搜索家政。
其次,我们要分析用户终端的设备,它区别于PC端搜索,手机的 *** 作系统会影响用户的搜索习惯,所以尽可能地选择短词,指数比较大的词。
第三,我们要研究自己的竞争对手,看哪些是我们能够模仿或者超越的,哪些是应该避开竞争的。比如关键词“外卖”已经被“美团”、“饿了吗”等行业的领头羊所霸占,布局的意义不大。
第四,关键词分析工具的使用,例如百度指数,微信指数包括Google 关键词 工具等。
以上就是小马识途对小程序优化的简要分析,小程序虽然不像网站具有很大的优化空间,但是不经过优化的小程序可能只有深藏闺中难以被用户找到,所以既然选择了布局微信小程序,就一定把这块工作做深做透,缺乏专业人员支持的可以选择小马识途这样的专业营销公司,定制化分析企业需求,量身打造属于企业自己的小程序优化方案和网络营销方案。
以上就是关于Java程序性能优化(3)全部的内容,包括:Java程序性能优化(3)、如何优化JAVA程序设计和编码,提高JAVA性能、Java程序性能优化--让你的Java程序更快、更稳定等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)