2018nc6开发参考经验积累代码质量_第1页
2018nc6开发参考经验积累代码质量_第2页
2018nc6开发参考经验积累代码质量_第3页
2018nc6开发参考经验积累代码质量_第4页
2018nc6开发参考经验积累代码质量_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

代码质量用友金融信息技术有限公司姜冬金2013年3月6日代码质量代码质量代码规范编程规范SQL编写规范代码性能JAVA代码调优数据库调优代码规范代码规范—代码书写规范编程规范必须给程序加注释。注释能够极大提高代码的质量。代码的书写必须清晰、易读。适当的将代码分段可以使代码更加清楚。可以使用‘{’‘}’将函数分成若干个小的单元;适当的加入空行可以使代码更加清晰。例如在函数的定义后面加入两个空行,在两个逻辑小代码单元间加入一个空行;建议遵循三十秒原则。如果另一个程序员无法在三十秒之内了解你的函数做了什么,如何做以及为什么要这样做,那就说明你的代码是难于维护的,必须得到提高;在一个函数内代码的长度不允许超过150行。建议如果一个函数的代码长度超过一个屏幕,那么或许这个函数太长了。一行代码尽量简短,并且保证一行代码只做一件事。那种看似技巧性的冗长代码只会增加代码维护的难度。保证不必左右拉动滚动条来阅读一整行代码,将会使你的代码更加可读,这一点包括注释;代码规范—代码书写规范使用统一的格式化代码。将‘{’放在所有者的后面,并且在下一行代码前加入TAB键4格缩进;(TAB键比用若干个空格更容易控制使用统一的缩进距离)if(XXX){while(XXX){xxxxxx}}变量名、方法名、类名命名要有意义,禁止使用类似于a,b,c这种命名,禁止使用汉语拼音命名。严格遵守异常处理规范,严禁直接打印异常。接口实现类中的全局变量要慎重使用,因为当调用时是全局共享的,会导致不可预见的问题发生。面向接口编程,禁止在方法中使用ArrayList等声明变量,必须用其接口List,Map等声明,除非必须使用这些实现类中的方法。

代码规范—代码书写规范方法只做一件事,同时在做几件事的代码很难理解,一个方法可能包含初始化对象、清除数据、解析输入等,如果我们要对其中某一件事进行修改那必须确保我们把所有代码读完后才能放心的修改,降低了程序的可能读和维护效率。变量的作用域尽可能小,同时避免一个变量多次赋值。减少不必要的临时变量。

代码规范—SQL编写规范SQL编写规范SQL语句全部使用小写。引用字符时用单引号。如:updatetestablesetidcol=’abcd’。连接符或运算符or、in、and、=、<=、>=,+,-等前后加上一个空格。严禁使用select*…….形式的语句,必须指出select的具体字段,即selectcol1,col2,…fromtableawhere….严禁使用insertintotablevalues(?,?,?),必须指出具体要赋值的字段,即insertintotablea(col1,col2,…)values(?,?,…)SQL语句包含多表连接时,建议对每个表命名别名,对每个字段的使用都要带上表别名,即selecta.col1,a.col2,b.col3fromtableaa,tablebbwherea.col4=b.col5代码规范—SQL编写规范在子查询中前后必须加上括号,selectcol1,col2fromtableawherecol3in(selectcol4fromtablebwherecol4>0)代码性能代码性能—JAVA调优JAVA调优尽量在合适的场合使用单例

使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例

主要适用于以下三个方面:

控制资源的使用,通过线程同步来控制资源的并发访问;

控制实例的产生,以达到节约资源的目的;

控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。尽量避免随意使用静态变量

要知道,当某个对象被定义为static的变量所引用,那么GC通常是不会回收这个对象所占有的内存,如publicclassA{staticBb=newB();}此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。代码性能—JAVA调优尽量避免过多过常的创建Java对象

尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度的重用对象,最好能用基本的数据类型或数组来替代对象。尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。尽量处理好包装类型和基本类型两者的使用场所

虽然包装类型和基本类型在使用过程中是可以相互转换,但它们两者所产生的内存区域是完全不同的,基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。

在集合类对象中,有对象方面需要的处理适用包装类型,其他的处理提倡使用基本类型。代码性能—JAVA调优慎用synchronized,尽量减小synchronize的方法

都知道,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以synchronize的方法尽量小,并且应尽量使用方法同步代替代码块同步。尽量使用StringBuilder和StringBuffer进行字符串连接 String是不可变对象,每进行一次字符串连接都会在String的运行时常量池中创建一个新的String对象,而运行时常量池是位于方法区内,不利于GC的回收,造成大量的内存被占用。而StringBuilder和StringBuffer则是可变字符串对象,不会产生上述问题,同时StringBuilder是非线程安全的,在单线程编程中,应该使用StringBuilder,其性能优于StringBuffer。代码性能—JAVA调优尽量不要使用finalize方法

实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收新生代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。容器的使用技巧

单线程编程多使用HashMap、ArrayList,因为HashTable、Vector等使用了同步机制,降低了性能。多线程编程的时候不能使用HashMap,这个可能产生死锁,应该使用ConcurrentHashMap,ConcurrentHashMap在并发性方面优于HashTable。

对于HashMap、HashTable、ArrayList、Vector等底层基于数组结构的容器,设置其初始化容量可以极大的避免自动扩增其空间,极大的提高性能。设置初始化空间的时候,要考虑容积率,一般容器默认的容积率为0.75,初始化容量=预计容量/0.75。代码性能—JAVA调优

ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。尽量减少对变量的重复计算

如 for(inti=0;i<list.size();i++)应该改为 for(inti=0,len=list.size();i<len;i++)并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。代码性能—JAVA调优尽量避免不必要的创建如Aa=newA();if(i==1){list.add(a);}应该改为if(i==1){Aa=newA();list.add(a);}尽量在finally块中释放资源

程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。尽量使用移位来代替'a/b'的操作

“/”是一个代价很高的操作,使用移位的操作将会更快和更有效

如 intnum=a/4;intnum=a/8;应该改为 intnum=a》2;intnum=a》3;但注意的是使用移位应添加注释,因为移位操作不直观,比较难理解。代码性能—JAVA调优尽量使用移位来代替'a*b'的操作同样的,对于'*'操作,使用移位的操作将会更快和更有效如intnum=a*4;intnum=a*8;应该改为intnum=a《2;intnum=a《3;尽量避免使用二维数组

二维数据占用的内存空间比一维数组多得多,大概10倍以上。尽量避免使用split

除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。代码性能—JAVA调优尽量使用System.arraycopy()代替通过来循环复制数组 System.arraycopy()要比通过循环来复制数组快的多。尽量缓存经常使用的对象

尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。代码性能—JAVA调优尽量早释放无用对象的引用

大部分时间,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null.

例如: Publicvoidtest(){Objectobj=newObject();……Obj=null;}

上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面: Publicvoidtest(){Objectobj=newObject();……Obj=null;//执行耗时,耗内存操作;或调用耗时,耗内存的方法……}这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。代码性能—JAVA调优慎用异常

当创建一个异常时,需要收集一个栈跟踪(stacktrack),这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大。当需要创建一个Exception时,JVM不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈操作。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素。

如果创建一个Exception,那么就得付出代价。好在捕获异常开销不大,因此可以使用try-catch将核心内容包起来。从技术上讲,甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是throw操作(尽管在没有预先创建异常的情况下就抛出异常是有点不寻常)。真正要花代价的是创建异常。幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就抛出异常。异常是为异常的情况而设计的,使用时也应该牢记这一原则。代码性能—JAVA调优把try/catch移出循环

try/catch块要创建异常对象,Throwable接口的构造函数会检查堆栈,收集调用跟踪信息比较耗时,应放到循环体外,放到内部会极大的影响性能。HashMap的遍历,使用entrySet方法的遍历方式效率较高

因为entrySet是获取HashMap内部的entrySet属性,这个属性本来就有值,不需要遍历获得,而keySet每次都需要遍历获得且需要从hashmap通过get获取值,所以entrySet这个方法比keySet方法少一次遍历,效率高。开辟缓冲区,缓解应用程序上下层的性能差异

缓冲可以协调上层组件和下层组件的性能差。当上层组件性能优于下层组件时,可以有效的减少上层组件对下层组件的等待时间。上层应用组件不需要等待下层组件真实地接受全部数据,即可返回操作,加快了上层组件的处理速度,从而提升了系统整体性能。如BufferedWriter为FileWriter增加了缓冲功能。代码性能—JAVA调优对象复用—池

对象池化,是目前非常常用的一种系统优化技术。其中最为大家所熟悉的,就是线程池和数据库连接池。除了线程池和数据库连接池,对于普通的java对象,在必要的时候也可以进行池化管理。Apache提供了JakartaCommonsPool对象池组件。并行替代串行

随着多核时代的到来,CPU的并行能力有了很大的提升,传统的串行技术无法发挥CPU的最大潜力,并行软件开发技术在这方面将CPU性能发挥到极致。JAVA中提供了Thread对象和Runnable接口。代码性能—数据库调优数据库调优—SQL调优提高查询效率1、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。2、应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:selectidfromtwherenumisnull可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:selectidfromtwherenum=03、应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。4、下面的查询也将导致全表扫描:selectidfromtwherenamelike'%abc%'若要提高效率,可以考虑全文检索或者改成前缀检索。代码性能—数据库调优5、应尽量避免在where子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:selectidfromtwherenum/2=100应改为:selectidfromtwherenum=100*26、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。7、在使用索引字段作为条件时,如果该索引是复合索引,要考虑联合索引的可选性和前缀性,去建立正确的索引。8、很多时候用exists代替in是一个好的选择,具体还是根据执行计划去分析使用exists还是in。9、并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,男女几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。代码性能—数据库调优10、索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率,因为insert或update时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。11、避免频繁创建和删除临时表,以减少系统表资源的消耗。12、在新建临时表时,如果一次性插入数据量很大,那么可以使用selectinto代替createtable,避免造成大量log,以提高速度;如果数据量不大,为了缓和系统表的资源,应先createtable,然后insert。13、如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncatetable,然后droptable,这样可以避免系统表的较长时间锁定。代码性能—数据库调优14、尽量避免大事务操作,提高系统并发能力。15、尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论