Ticket #111 (closed defect: fixed)
关于small_company_news_json.jsp接口的优化
| Reported by: | huangjianhua | Owned by: | huangjianhua |
|---|---|---|---|
| Priority: | major | Milestone: | 2012年6.0版本 |
| Component: | 商家后台 | Version: | 6.0 |
| Keywords: | small_company_news_json.jsp 接口优化 | Cc: | |
| Due Date: | 23/07/2012 |
Description
优化 small_company_news_json.jsp 接口:
优化前:
整个接口的数据出来是需要20多秒的,最长时间可达到30秒才出来.
经过输出日志的时间对比后,拖慢整个接口数据出来的主要有两个地方:
1). 执行SQL语句所花时间:
查找Sql语句所用的时间,单表查询,每个关键字段都带有索引,查询所有满足结果的数据,这里所花费的时间大概在4-5秒之间,具体跟我们所传参数有关.然而,在数据库上面执行却花费不了多少时间,所有的执行均在1秒内完成.
2).去重所花时间:
过滤每个商家只出一条数据,所花时间要20秒左右.在这里去重所调用的方法如下:
/**
* 对查出来的商情过滤每个商家取一条商情 (过滤商情)
* @param newsList
* @return
*/
private List<News> filterSameNews(List<News> newsList){
List<News> newsListTmp = new ArrayList<News>();
List<Long> companyIdList = new ArrayList<Long>();
for(News news:newsList){
Long companyId = Long.valueOf(news.getCompany().getId());
if(!companyIdList.contains( companyId)){
companyIdList.add( companyId );
newsListTmp.add( news );
}
}
companyIdList = null;
return newsListTmp;
}
分析:
从上面所述中,调用代码现有的方法去重花费了大量的时间,这个去重的方法用了List去重, 要去重的List 是查询整条SQL所返回的数据,数据有可能会比较大,所以在这里花费了比较多的时间,其实很多时候,我们并不需要对整个数据结果的去重,当去重到足够的数据(我们的接口有时候只要出10-15条数据)够我们接口显示即可了,无需再去对其他的数据去重,即当去重到足够的数据后应该要跳出这个去重的循环.
执行优化:
1).应用中执行SQL语句慢,优化方法:从查询的结果当中(结果已经排序好了),我们用分页的方法,只取了足够大的数据用来去重.这里用了(200条数据). 所花费时间在1秒内.
2).优化去重方法:
代码如下:
/**
* 对查出来的商情过滤每个商家取num条商情 (过滤商情)
* @param newsList
* @return
*/
private List<News> filterNews(List<News> newsList, int max, int num){
Map<Long, Integer> map = new HashMap<Long, Integer>();
List<News> result = new ArrayList<News>();
for(News news:newsList){
if (result.size() >= max) {
break;
}
Long companyId = Long.valueOf(news.getCompany().getId());
if(map.containsKey(companyId) && (map.get(companyId).intValue()) >= num){
continue;
} else {
result.add(news);
if(map.containsKey(companyId)){
map.put(companyId, new Integer(map.get(companyId).intValue()+1));
}else{
map.put(companyId, new Integer(1));
}
}
}
return result;
}
从这个方法中可以看到, 重新添加了过滤方法,使用Map 数据结构,添加了对每个商家可以显示多条的判断,最重要的一点就是这个去重方法,去重后的数据满足我们接口所显示的时候,循环马上跳出中止. 从线上的数据来看,执行去重的方法,大概是用了几十毫秒.
![(please configure the [header_logo] section in trac.ini)](http://www1.pconline.com.cn/global/2008/images/jss/m_logo091125.jpg)
very good,我们的开发需要的就是这样细致的思考和实践。