随笔-348  评论-598  文章-0  trackbacks-0

目前正在为一个C/S架构的超市业务往来系统进行系统架构,为了提升性能和改善维护性,我准备使用对象池技术,在此之前参考了BeanSoft的那篇对象池代码,用.Net重写了一个并测试了性能。

测试用例:
    10000次生成OleDbConnection的实例,并使用Open方法打开连接
结果:
    直接使用new语句生成实例不释放 需要12秒多一点
    使用对象池生成实例不释放 需要7秒多一点
    性能提升约 48%左右

但是如果在每次使用之后都调用Close()方法释放资源的话,则两者性能基本相同。

看来主要是因为占用的资源不释放,导致系统变慢。换句话说,如果系统需要比较频繁的调用某些对象的实例的话,那么可以使用对象池技术来改善总体性能。



---------------------------------------------------------
专注移动开发

Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2007-11-10 22:53 TiGERTiAN 阅读(1311) 评论(4)  编辑  收藏 所属分类: JavaDotNet

评论:
# re: 对象池技术[未登录] 2007-11-11 09:59 | 吴开春
对象池相对于new的优势表现在对象重用上,这之间少了一个(创建时间-检索时间).另外,每次新建对象的产生和jvm垃圾收集过程对系统性能的影响也同时消除了.理论上是应该加快系统运行速度.

感觉比较适用于运行期状态无关类,否则每次都要恢复默认,用起来也是很麻烦的一件事.  回复  更多评论
  
# re: 对象池技术 2007-11-11 12:55 | TiGERTiAN
运行期状态有关的类也可以用,不过需要定义一个Close之类的方法,然后利用反射机制调用该方法来释放资源和恢复默认值。  回复  更多评论
  
# re: 对象池技术 2007-11-11 22:54 | flybean
当调用者调用的close()方法应该是将连接返回到池中,真正关闭连接是池要做的。  回复  更多评论
  
# re: 对象池技术 2007-11-12 11:19 | TiGERTiAN
@flybean
这样做是对的,不过我想用对象池技术,而不单纯用连接池。
我昨天晚上作了一个多小时的测试,发现用反射机制调用Close()方法关闭连接,空间和时间都增加了3%-5%,这不是我所希望的,所以我可能会用一个方法封装好Close(),其中显示的调用Close,这样不必要花费反射的代价。

不知道flybean又没有好的办法,在对象池中进行资源的释放。   回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: