.Where 및 .Contains를 사용한 솔루션은 O (N 제곱)의 복잡성을가집니다. Simple .Join은 훨씬 더 나은 성능을 가져야합니다 (해싱으로 인해 O (N)에 가까움). 따라서 올바른 코드는 다음과 같습니다.
_dataContext.UserProfile.Join(idList, up => up.ID, id => id, (up, id) => up);
그리고 이제 측정 결과입니다. 100,000 개의 UserProfile과 100,000 개의 ID를 생성했습니다. Join은 32ms, .Where with .Contains는 2 분 19 초가 걸렸습니다! 이 테스트에서 내 진술을 증명하기 위해 순수 IEnumerable을 사용했습니다. IEnumerable 대신 List를 사용하면 .Where 및 .Contains가 더 빠릅니다. 어쨌든 그 차이는 중요합니다. 가장 빠른 .Where .Contains는 Set <>입니다. 모든 것은 .Contains에 대한 기본 콜레 션의 복잡성에 달려 있습니다. 봐 이 게시물 아래에있는 내 테스트 샘플에 complexity.Look LINQ에 대해 배울 수 :
private static void Main(string[] args)
{
var userProfiles = GenerateUserProfiles();
var idList = GenerateIds();
var stopWatch = new Stopwatch();
stopWatch.Start();
userProfiles.Join(idList, up => up.ID, id => id, (up, id) => up).ToArray();
Console.WriteLine("Elapsed .Join time: {0}", stopWatch.Elapsed);
stopWatch.Restart();
userProfiles.Where(up => idList.Contains(up.ID)).ToArray();
Console.WriteLine("Elapsed .Where .Contains time: {0}", stopWatch.Elapsed);
Console.ReadLine();
}
private static IEnumerable<int> GenerateIds()
{
// var result = new List<int>();
for (int i = 100000; i > 0; i--)
{
yield return i;
}
}
private static IEnumerable<UserProfile> GenerateUserProfiles()
{
for (int i = 0; i < 100000; i++)
{
yield return new UserProfile {ID = i};
}
}
콘솔 출력 :
경과. 가입 시간 : 00 : 00 : 00.0322546
경과 .Where. 시간 포함 : 00 : 02 : 19.4072107