class Person
{
public string Name { get; set; }
public int Age { get; set; }
} |
private static void GeneralSort(List<Person> people)
{
List<Person> resultPeople = new List<Person>();
foreach (Person person in people)
{
if (person.Age >= 50)
resultPeople.Add(person);
}
resultPeople.Sort((p1, p2) => p1.Age.CompareTo(p2.Age));
foreach (var item in resultPeople) { }
} |
private static void ThreadSort(List<Person> people)
{
var resultPeople = new List<Person>();
int partitionsCount = Environment.ProcessorCount;
int remainingCount = partitionsCount;
var enumerator = (IEnumerator<Person>)people.GetEnumerator();
try
{
using (var done = new ManualResetEvent(false))
{
for (int i = 0; i < partitionsCount; i++)
{
ThreadPool.QueueUserWorkItem(delegate
{
var partialResults = new List<Person>();
while (true)
{
Person baby;
lock (enumerator)
{
if (!enumerator.MoveNext()) break;
baby = enumerator.Current;
}
if (baby.Age >= 50)
{
partialResults.Add(baby);
}
}
lock (resultPeople) resultPeople.AddRange(partialResults);
if (Interlocked.Decrement(ref remainingCount) == 0) done.Set();
});
}
done.WaitOne();
resultPeople.Sort((p1, p2) => p1.Age.CompareTo(p2.Age));
}
}
finally
{
if (enumerator is IDisposable) ((IDisposable)enumerator).Dispose();
}
foreach (var item in resultPeople) { }
} |
private static void ParallelSort(List<Person> people)
{
var resultPerson = from person in people.AsParallel()
where person.Age >= 50
orderby person.Age ascending
select person;
foreach (var item in resultPeople) { }
} |
Q : 왜 foreach (var item in resultPeople) { } 코드를넣었나요?
A: 동일한 테스트를 하기 위함입니다. LINQ 식은 내부 구조의 특성상 “쿼리식”에 불과합니다.
보다 자세한 내용은 필자의 블로그를 참고하세요.
|
'C# Parallel Programming' 카테고리의 다른 글
Welcome to Parallel C#(2) - 계속 되는 개념 찾기. (0) | 2010.05.27 |
---|---|
Welcome to Parallel C#(1) - 굿바이, 그리고 안녕~~? (0) | 2010.05.24 |
Welcome to Parellel world(1) - Here comes a new challenger! (2) | 2009.05.16 |
[C# 4.0] Parallel Extension - [3] TPL(Task Parallel Library) (0) | 2009.03.01 |
[C# 4.0] Parallel Extension - [2] 병렬 처리 아키텍처 (0) | 2009.02.16 |