要性能,还是要设计?

03-08-27 Sean
今天到新公司上班,写了一段非常简单的代码,负责把数据库一个表的log逐条显示出来,我写了一个XXLog类,用一个静态方法得到一个Iterator,里面容纳查询到的XXLog:

public class XXLog{

String logname;

Date logtime;

...

public static Iterator getAllLogs(Date d,int start,int num){

...

while(rs.next()){

XXLog alog = new XXLog();

alog.setLogname(rs.getString(1));

...

}

}

}

这种设计有无问题?

我也发现里面new了许多XXLog对象,对性能影响是很大的

于是采用同事建议

public class XXLog{

public Hashmap[] getAllLogs(){

...

while(rs.next()){

Hashmap.put("column1",rs.getString(1));

Hashmap.put("column2",rs.getString(2));

...

}

return Hashmap;

}

将数据保存到一个hashtable数组里面返回给调用端

这样避免了new许多实体对象

不过感觉好像不是面向对象的设计思路

可是性能肯定会好许多

。。。

还有要提到的就是jive的相关设计

jive取多个帖子的方法是这样:

查询到需要的帖子的id保存到一个Iterator里面

然后继承Iterator的next方法,在next方法里面

按照id去得到相关的帖子

这样是否加大了查许的频度?

比如要取得20条帖子,查到20个id后,再

根据每个id去select20次帖子出来

总共检索数据库21次,还不如用hashtable容纳结果

一次传过来

         

banq
2003-08-28 09:16
使用Hashtable传送数据是不可取做法,不利于以后扩展和重用。

提高性能不是使用这种低级办法,如果是这样,还是那句话,使用汇编好了。

你原来的方案虽然重视俩OO,但是没有更进一步从性能上设计考虑。

而Jive的Iterator模式使用提供了借鉴,按照需要取出记录,一次性只取出一个页面的数据库记录,当然之前通过将所有ID都查询出来,这种查询是很快地,在EJB中或O/R mapping技术中,表面上代码只有一句,底层机制还是可能实现多次查询的,这已经是Java为提高OO设计采取的共同默认的办法。

再解释一下Jive的Iterator原理,Jive根据客户端查询语句,将所有满足条件的ID集合出来,比如有200个,但是每页只显示20个,那么就从数据库查询20条记录,并封装成对象如JiveMessage传送到表现层,表现层使用iterator遍历这个20条记录数据对象集合,输出到浏览器。

Java是重视设计的,所以才牺牲一些性能,如果你确实需要性能,那么可以象使用过程语言一样使用Java,到处是长方法,到处是基本数据类型,HashTable满天飞,但是这样做的后果是,当系统复杂到一定程度,开发者自己就会崩溃,要么离职,要么升官。

我一直认为,既然你选择Java,那么就意味着你走上一条重视设计的道路,千万别叶公好龙。

robbin
2003-08-28 15:36
这两种设计全都不对,其实不关性能还是设计的选择问题,你不过是在两种不同类型的错误的设计中选择一个罢了。

ccmoon
2003-08-28 19:02
那么banq你认为怎样才能提升他的第一个程序的性能

我也是这样做的

我认为似乎没有什么更好一点的办法

能不能给点idea

sim114
2003-08-29 11:53
晕,除了这两种方法我还不知道有其他的哪???

这两种设计全都不对,

猜你喜欢
7Go 1 2 3 4 ... 7 下一页