### 架构设计-性能篇:性能设计注意事项 在架构设计的过程中,性能设计是一个至关重要的环节,但往往容易被忽视。良好的性能设计不仅能够确保系统的高效运行,还能够在一定程度上减少后期维护的成本与复杂度。以下是一些在进行架构设计时需要注意的关键性能问题: #### 1. I/O操作优化 - **避免频繁的I/O操作**:I/O操作通常是非常耗时的操作,特别是在涉及到磁盘读写或网络通信的情况下。因此,在设计系统时应当尽可能地减少这类操作的发生频率。 - **合理利用缓存机制**:通过缓存机制可以有效地降低对数据库等后端服务的请求次数,从而减轻后端的压力并提高响应速度。 #### 2. 避免短生命周期对象的创建 - **字符串对象管理**:例如,频繁创建`String`对象会导致大量的内存消耗和垃圾回收开销。建议使用`StringBuilder`或`StringBuffer`来处理字符串拼接操作。 - **细粒度远程通信**:过度的细粒度远程调用会增加网络通信的延迟,并可能导致网络拥塞。应考虑将多个请求合并为一次请求来减少网络交互次数。 #### 3. CPU资源的合理分配 - **避免过度的CPU消耗方法**:某些方法可能在执行过程中消耗大量的CPU资源,如复杂的计算、不必要的循环等。通过对这些方法进行优化可以显著提升系统的整体性能。 - **线程与监控竞争**:当多个线程争用同一资源时,可能会出现线程阻塞或者死锁的情况,这将严重影响系统的性能。合理地设计线程模型,避免不必要的同步操作是提高并发性能的关键。 #### 4. 数据持久化与I/O例程 - **数据库连接池**:通过使用数据库连接池可以有效地管理数据库连接资源,减少连接创建与释放带来的开销。 - **日志记录**:日志记录虽然对于调试和监控非常重要,但如果处理不当也会成为性能瓶颈之一。合理配置日志级别,避免在生产环境中记录过多的日志信息。 #### 5. 数据结构与Java语言构造的选择 - **选择合适的数据结构**:不同的数据结构在性能表现上存在差异,如`HashMap`比`Hashtable`更高效(除非特别需要线程安全),`ArrayList`通常优于`Vector`等。 - **合理设置JVM参数**:正确的JVM参数配置对于提升程序的性能至关重要,包括但不限于堆内存大小、垃圾回收策略等。 #### 6. 反射机制的使用 - **反射操作**:反射是一种非常强大的机制,但在性能方面却不是最佳选择。它通常比直接的方法调用慢很多倍,因此应当谨慎使用。 #### 7. 并发编程技术的应用 - **线程与线程池**:合理地使用线程池可以有效管理线程资源,避免因线程创建和销毁带来的开销。同时,使用并发工具类如`ExecutorService`、`Semaphore`等可以简化并发编程的复杂性。 #### 8. 代码优化技巧 - **类型转换**:频繁的类型转换会带来额外的开销,尤其是在涉及基本类型与包装类之间的转换时更为明显。 - **静态字段与常量**:使用`final static private`声明的字段可以在编译时就确定其值,从而减少运行时的查找成本。 #### 9. 输入输出操作的优化 - **网络通信优化**:在网络通信方面,应优先考虑使用更高效的协议和技术,比如使用NIO而非传统的BIO模型来提高传输效率。 #### 10. 异常处理 - **异常处理机制**:异常处理是软件开发中不可或缺的一部分,但不恰当的异常处理机制可能会导致性能下降。例如,过度使用try-catch块可能会增加不必要的开销。 在进行架构设计时,必须综合考虑以上各个方面的影响因素,并采取相应的措施来优化性能。只有这样,才能构建出既稳定又高效的系统架构。
性能设计首要考虑两点:你的系统哪些是同步的;哪些是异步的。该使用异步的使用了同步机制,会影响性能,有时效率高也是提高性能的一个重要手段。
设计的时候由于具体的算法和逻辑都没有确定,能决定性能的主要是io,包括数据库,socket,文件等。
基本上系统服务一个事务,有几个roundtrip,要通过哪几层io,合理的分配这些io的调用,降低不必要的io,可以让性能有个好的开始。
还有就是同步和争用的问题,这是在多线程设计的时候要重点考虑的,太多的线程在抢占同一个资源会降低性能。在多线程间同步一个庞大的资源,也会降低性能
1、short-lived object太多,尽量重用。eg:String
2、Excessive CPU consumption methods。
3、Fine-grained remote communication。过细的remote调用
4、persistence and I/O routines。DB用pool,logging也是IO操作,耗时(10%),应注意
5、Thread/Monitor contension。多线程在同一点上同步,造成堵塞。
6、poor choice of data structure and java language constructs.
7、improper JVM setting
解决方案:
1、Final,static,private尽量使用
2、用StringBuffer代替String
3、Type Casting昂贵,找折衷点
4、尽量cache
5、reflection昂贵,折衷
6、同步尽量避免
7、thread昂贵,尽量用thread pool。(Book:Concurrent programming A:Dao Lea)
8、选择上按优先级:Hashmap>Hashtable array>ArrayList>Vector。Hashtable,Vector是thread safe的,因此耗时,如为只读时,应分别用Hashmap、ArrayList代替。
9、IO昂贵,耗时,折衷
- 粉丝: 2
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助