产品中(基于ASP.NET MVC开发)需要经常对药品名称及名称拼音码进行下拉匹配及结果查询。为了加快查询的速度,所以我开始将其加入内存中(大约有六万五千条数据)。
  下面附实体类。
  public class drugInfo
  {
  public int drug_nameid  { get; set; }
  public string drug_name  { get; set; }
  public string drug_search_code  { get; set; }
  }
  第一次做法:
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
key = key.ToLower();
var resultList = cacheList.Where(m => m.drug_name.ToLower().Contains(key) || m.drug_search_code.ToLower().Contains(key)).ToList();
stopWatch.Stop();
double eMseconds = Math.Max(0, stopWatch.Elapsed.TotalSeconds);
  刷新页面几次,得到个平均用时约35MS左右。
  第二次做法:
  为了减少CPU的运算,我们将LINQ表达式中的转小写操作优化一下,先在缓存列表上做些动作,将名称和搜索码先转小写存储。
  下面为改进过的实体类。
public class drugInfo
{
public int drug_nameid  { get; set; }
public string drug_name  { get; set; }
public string drug_search_code  { get; set; }
public string lower_drug_name  { get; set; }
public string lower_drug_search_code  { get; set; }
}
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
key = key.ToLower();
var
resultList = cacheList.Where(m =>
m.lower_drug_name.Contains(key) ||
m.lower_drug_search_code.Contains(key)).ToList();
stopWatch.Stop();
double eMseconds = Math.Max(0, stopWatch.Elapsed.TotalSeconds);
ViewBag.useTime = string.Format("用时{0}秒rn", eMseconds);
  刷新页面几次,得到个平均用时约16MS左右。
  虽然这样做,内存列表中会多一些冗余数据,但是得到的性能提升有一倍了。