我有一个大记录列表,我需要遍历每个记录,添加一些过滤器和计算并将其添加到另一个列表中。我认为一一进行会影响性能,因为要花900秒才能显示12条记录。
我无法确定为什么花了太长时间。我使用了chrome开发人员工具来确定运行缓慢的地方。然后我发现加载花费0.2秒,脚本花费3s,渲染花费3s,空闲时间是3s,其他时间是2秒。
也许我正在使用实体框架,而数据表却使它变慢了。也许我的查询有问题。以下是我的代码:
public ActionResult Index(int id, string language)
{
var All_Employees = from employee in db.Employees
.Include(x => x.Country).Include(x => x.Status)
where enployee.GenderId == id
select employee ;
var List = new List<EmployeeListViewModel>();
foreach(var Record in All_Employees.ToList()
.OrderByDescending(x=> ParseDate(x.JoiningDate)))
{
EmployeeListViewModel item = new EmployeeListViewModel();
item.Id = Record.Id;
item.Code = Record.Code;
if(Record.CountryId != null)
{
if(language == "en")
{
item.Country = Record.Country.NameE;
}
else
{
item.Country = Record.Country.NameA;
}
}
item.Date = Record.JoiningDate;
int WorkingDays = 0;
if(Record.JoiningDate != null)
{
DateTime Joining= Convert.ToDateTime(ParseDate(Record.Record.JoiningDate));
TimeSpan t = DateTime.Now.Date - Joining;
int Days = int.Parse(t.TotalDays.ToString());
if (Days > 0)
{
WorkingDays = Days;
}
}
item.Days = WorkingDays.ToString();
if (Record.StatusId != null)
{
if (language == "en")
{
item.Status = Record.Status.NameE;
}
else
{
item.Status = Record.Status.NameE;
}
}
List.Add(item);
}
return View(List);
}
另一个原因可能是我要转换日期:
private static DateTime? ParseDate(string dateString)
{
if(dateString != null)
{
return DateTime.ParseExact(dateString, "dd-MM-yyyy", CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.None);
}
else
{
return null;
}
}
由于某些原因,我不想将日期归档为DateTime。
在当前情况下提高性能的最佳方法是什么?
答案 0 :(得分:-1)
您的代码中此处使用了过多的强制类型转换,并且创建了两次列表。一种执行如下代码的方法。
List<EmployeeListViewModel> lstData = EmployeeListViewModel.ToList();
for(int i = 0; i < lstData.Count; i++)
{
//Put logic here for required changes like Language and Date.
if(lstData[i].CountryId != null)
{
if(language == "en")
lstData[i].Country = lstData[i].Country.NameE;
else
lstData[i].Country = lstData[i].Country.NameA;
}
}
尝试减少专门用于字符串和日期时间的转换。下面是示例。
int Days = int.Parse(t.TotalDays.ToString());
在t.TotalDays以上行始终是int类型,无需再次转换为string和int。