id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	due_date
111	关于small_company_news_json.jsp接口的优化	huangjianhua	huangjianhua	"优化 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 数据结构,添加了对每个商家可以显示多条的判断,最重要的一点就是这个去重方法,去重后的数据满足我们接口所显示的时候,循环马上跳出中止. 从线上的数据来看,执行去重的方法,大概是用了几十毫秒.

"	defect	closed	major	2012年6.0版本	商家后台	6.0	fixed	small_company_news_json.jsp 接口优化		23/07/2012
