
说到代码优化,每个人或多或少都掌握一到两种方法,但是这样的方法对提升铅正代码运行效率效果不大,最重要是对代码的重视和了解,这样才能提升代码的运行效率。在进行代码优化的过程中,方法是非常重要的,多掌握几种方法,根据代码的不同情况选择适合的方法进行优化。下面电脑培训为大家介绍Java代码优化的几种方法。
1、使用指定类、方法的final修饰符
具有final修饰符的类不可派生。在Java核心API中,有许多槐吵悔最终应用程序的例子,例如java.lang.String,整个类都是final。为类指定final修饰符允许继承类,并且为方法指定final修饰符允许覆盖该方法。如果将类指定为final,IT培训认为该类的所有方法都是final。Java编译器将寻找内联所有最终方法的机会。内联对于提高Java *** 作的效率非常重要。这可以将性能平均提高50%。
2、重用对象
String对象的使用是非常重要的,StringBuilder/StringBuffer并不是字符串连接。由于Java虚拟机需要时间来生成对象,所以将来垃圾收集和处理这些对象可能需要一些时间。因此,生成太多对象将对程序的性能产生很大影响。
3、使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在堆栈中,速度更快。其他变量(如静态变量和实例变量)在堆中创建并且速度较慢。此外,沙河北大青鸟发现在堆栈中创建的变量,当方法完成运行时,内容消失,不需要进行额外的垃圾收集。
4、及时关闭流
在Java编程过程中,在执行数据库连接和I/O流 *** 作时要小心。使用后,北大青鸟沙河校区官网建议应及时关闭以释放资源。因为这些大型物体的 *** 作会导致系统的大量开销,碰消稍微粗心会导致严重的后果。
1)尽量指定类、方法的final修饰符。带有final修饰符的类是不可派生的,Java编译器会寻找机态码胡会内联所有的final方法,内联对于提升Java运行效率作用重大,此举能够使性能平均提高50%。
2)尽量重用对象。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此生成过多的对象将会给程序的性能带来很大的影响。
3)尽可能使用局部变量。调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建速度较慢。
4)慎用异常。异常对性能不利,只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。
5)乘法和除法使用移位 *** 作。用移位 *** 作可以极大地提高性能,因为在计算机底层,对帆拦位的 *** 作是最方便、最快的,但是移位 *** 作虽然快,可能会使代码不太好理解,因此最好加上相应的注释。
6)尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用 Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销。
尽量在合适的场合使用单例。使用单例模键可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例。
代理模式( )
代理模式也是一种很常见的设计模式 它使用代理对象完成用户请求 屏蔽用户对真实对象的访问 就如同现实中的代理一样 代理人被授权执行当事人的一些事宜 而无需当事人出面 从第三方的角度看 似乎当事人并不存在 因为他只和代理人通信 而事实上 代理人是要有当事人的授权 并且在核心问题上还需要请示当事人
在现实中 使用代理的情况很普遍 而且原因也很多 比如 当事人因为某些隐私不方便出面 或者当事人不具备某些相关的专业技能 而需要一个职业人员来完成一些专业的 *** 作 也可能由于当事人没有时间处理事务 而聘用代理人出面
在软件设计中 使用代理模式的意图也很多 比如因为安全原因 需要屏蔽客户端耐答直接访问真实对象 或者在远程调用中 需要使用代理类处理远程方法调用的技术细节(如RMI) 也可能是为了提升系统性能 对真实对象进行封装 从而达到延迟加载的目的 在本小节中 主要讨论使用代理模式实现延迟加载 从而提升系统的性能和反应速度
代理模式的结构
代理模式的主要参与者有 个 如表 所示
表 代理模式角色
以一个简单的示例来阐述使用代理模式实现延迟加载的方法及其意义 假设某客户端软件 有根据用户请求 去数据库查询数据的功能 在查询数据前 需要获得数据库连接 软件开启时 初始化系统的所有类 此时尝试获得数据库连接 当系统有大量的类似 *** 作存在时(比如xml解析等) 所有这些初始化 *** 作的没旅叠加 会使得系统的启动速度变得非常缓慢 为此 使用代理模式 使用代理类 封装对数据库查询中的初始化 *** 作 当系统启动时 初始化这个代理类 而非真实的数据库查询类 而代理类什么都没有做 因此 它的构造是相当迅速的
在系统启动时 将消耗资源最多的方法都使用代理模式分离 就可以加快系统的启动速度 减少用户的等待时间 而在用户真正做查询 *** 作时 再由代理类 单独去加载真实的数据库查询类 完成用户的请求 这个过程就是使用代理模式实现了延迟加载
注意 代理模式可以用于多种场合 如用于远程调用的网络代理 考虑安全因素的安全代理等 延迟加载只是代理模式的一种应用场景
延迟加载的核心思想是 如果当前并没有使用这个组件 则不需要真正地初始化它 使用一个代理对象替代它的原有的位置 只要在真正需要使用的时候 才对它进行加载 使用代理模式的延迟加载是非常有意义的 首先 它可以在时间轴上分散系统压力 尤其在系统启动时 不必完成所有的初始化工作 从而加速启动时间 其次 对很多真实主题而言 在软件启动直到被关闭的整个过程中 可能根本不会被调用 初始化这些数据无疑是一种资源浪费 图 显示了使用代理类封装数据库查询类后 系统的启动过程
图 代理类的工作流程
若系统不使用代理模式 则在启动时就要初始化DBQuery对象 而使用代理模式后 启动时只需要初始化一个轻量级的对象DBQueryProxy
系统的结构图如图 所示 IDBQuery是主题接口 定义代理类和真实类需要对外提供的服务 在本例中了定义了实现数据库查询的公共方法request()函数 DBQuery是真实主题 负责实际的业务 *** 作 DBQueryProxy是DBQuery的代理类
返回目录 Java程序性能优化 让你的Java程序更快 更稳定
枯亩凳 编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
J ME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
lishixinzhi/Article/program/Java/gj/201311/27834
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)