架构设计之性能考虑

设计一个开发架构的时候,通常最主要考虑的是可扩展性、可维护性等,那么架构的性能在设计的时候重要吗,要考虑吗,有那些影响变量?
请教各位大侠,特别banq大哥给点指点,新来的,:)

不用客气,随便说说。

性能当然很重要,也是在设计时必须考虑的,架构设计实际是一个平衡设计,在可扩展性、可维护性、高性能等之间做个妥协选择。

性能设计首要考虑两点:你的系统哪些是同步的;哪些是异步的。该使用异步的使用了同步机制,会影响性能,有时效率高也是提高性能的一个重要手段。


涉及面很广,只能说一点了。

设计的时候由于具体的算法和逻辑都没有确定,能决定性能的主要是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昂贵,耗时,折衷
10、net communication尽量少用。

楼上的各位真是让兄弟茅塞顿开啊,原来是影响性能的因素有这么多!
可是通常讲解架构设计的资料充分考虑性能平衡的好像不太多,更多的讲如何进行抽象,如何解藕使得架构更加灵活,更多的封装变化,其实性能也很重要,是吧?!

小弟谢过楼上各位了!

3、Type Casting昂贵,找折衷点。。。。

请教hyzou,以上这句话是什么意思,Type Casting的时候很耗资源吗?
比如

(SomeObject)vecData.elementAt(i);

类似这样的Casting很耗资源吗,有别的办法吗,还是别的什么意思?

Just Do IT.
然后设法找到瓶颈,并解决之。。。

如果主要面向DB, 频繁的数据库查询是或许是最大的瓶颈,此时优化数据库是你的
解决之道,而如果处理较大的文件的话,IO就是瓶颈,真的没有好办法的。

在不得已的时候,你可以考虑用perl或C来处理文件,然后java读处理结果,
速度可以提高10倍。

to qlwangbj:

嗯,这个地方是写错了,多谢指正
附上一个java耗时表,从表中可以看出,有一个忘说了,不能滥用exception,特别是用exception作逻辑。

method call=1
cast=5
synchronize=24
new object=27
new array=36
reflection=100
new string(>4char)=125
exception=690-1850

to hyzou:

谢谢,感觉你做的东西很深入。。。


这个网站上有不错的性能文章

可有再直观的比较么,一次通常的IO操作大约是多少?

大部分情况,差的构架是导致性能低下的原因。差的构架使得你调试,优化以及测试困难。这本身就是导致性能低下的主要原因:它本身难以查找瓶颈,难以测试,导致难以优化。

性能低下的系统通常因为具有瓶颈效应,瓶颈效应又因为是没有足够好

的抽象。在一个设计良好的系统,通过refactoring或者采用模式等手段,

最后往往孤立(这就是OO的强大之处吧)了一些导致瓶颈的“关键”因

素。这样容易单独测试,也就容易查找瓶颈。如果万一性能低下,那么我

们所要做的就是对症下药。好像看病一般,世界上绝大部分不好的病都是因为难以找到病因,一旦找到病因,一切就OK了,我们翻翻书,照方开药。

java性能网,很不错啊。。。。

我等是粗人,构架就不说了,遇到瓶颈如socket、jdbc(并发量大情况)等,没什么好说的,一律用jni或自己写server搞定!效果很好!
java中类封装得很好,设计上很牛B,但性能上真是不敢恭维呢。举个例子,如果你要得到 yyyymmdd hhss 格式当前日期时间字符串,用 DateFormat 之类的东东不仅麻烦而且其慢无比,某些OS下(如SCO)多线程并发调用之居然还会出错!绕过它,直接用其内部封装的GregorianCalendar,一切OK!当然这种做法大大背离了原设计者的初衷,也很不规矩,但不得已啊。

切记,数据量的考虑!!!