Ticket #111 (closed defect: fixed)

Opened 14 years ago

Last modified 13 years ago

关于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 数据结构,添加了对每个商家可以显示多条的判断,最重要的一点就是这个去重方法,去重后的数据满足我们接口所显示的时候,循环马上跳出中止. 从线上的数据来看,执行去重的方法,大概是用了几十毫秒.

Change History

comment:1 Changed 14 years ago by chenchongqi

very good,我们的开发需要的就是这样细致的思考和实践。

comment:2 Changed 13 years ago by huangjianhua

  • Status changed from new to closed
  • Resolution set to fixed
Note: See TracTickets for help on using tickets.