면책 조항 : 나는 Linq에 약간의 경험이 있습니다.Linq와 루프를 최적화하는 데 도움이 필요
내 작업에서 내 작업 중 하나는 전자 상거래 웹 사이트를 유지하는 것입니다. 어제 Google 고객 중 한 명이 Google 용 피드 파일을 만들려고 할 때 발생하는 시간 초과에 대해 불평하기 시작했습니다. 사용자가 9,000 개가 넘는 항목을 피드 파일에 넣을 경우 Google 코드에서 실행하는 데 최소 1 분이 소요됩니다.
디버거를 실행하여 문제의 원인을 찾을 수 없으므로 프로필러 (ANTS)를 실행하여 문제를 해결하도록했습니다. 그것은 우리의 문제의 근원, linq 코드의 비트를 포함 foreach 루프를 발견했다. 코드는 다음과 같습니다.
var productMappings = GoogleProductMappingAccess.GetGoogleProductMappingsByID(context, productID);
List<google_Category> retCats = new List<google_Category>(numCategories);
int added = 0;
//this line was flagged by the profiler as taking 48.5% of total run time
foreach (google_ProductMapping pm in (from pm in productMappings orderby pm.MappingType descending select pm))
{
if (pm.GoogleCategoryId.HasValue && pm.GoogleCategoryId > 0)
{
//this line was flagged as 36% of the total time
retCats.Add(pm.google_Category);
}
else if (pm.GoogleCategoryMappingId.HasValue && pm.GoogleCategoryMappingId > 0)
{
retCats.Add(pm.google_CategoryMapping.google_Category);
}
else
{
continue;
}
if (++added >= numCategories)
{
break;
}
}
경험이 많은 개발자 중 아이디어가 있습니까? 나는 linq 모든 SQL을 대체하려고 노력하고 놀고 있었지만, 그것이 최선의 과정은 여기에 있는지 확실하지 오전 (linq로 작성된 경우, 그것에 대한 이유가 있어야합니다).
루프에서 linq을 수행하지 마십시오. 결과를 변수에 저장하고 사용하십시오. – madmik3
빠른 수정을 위해 DataContext.CommandTimeout을 위로 올리십시오. –
그렇게 할 필요가 없어 질 수도 있습니다. 가능하다면 피하기를 좋아한다. – CountMurphy