我一直在測試System.Threading.Parallel與線程的性能,我很驚訝地看到並行需要更長的時間才能完成任務,而不是線程。我相信這是由於我對Parallel的知識有限,我剛剛開始閱讀。C#並行VS.線程代碼的性能
我想我會分享一些片段,如果有人可以指出我並行代碼運行速度較慢與線程代碼。還嘗試運行相同的比較來查找素數,並發現並行代碼比線程代碼晚得多。
public class ThreadFactory
{
int workersCount;
private List<Thread> threads = new List<Thread>();
public ThreadFactory(int threadCount, int workCount, Action<int, int, string> action)
{
workersCount = threadCount;
int totalWorkLoad = workCount;
int workLoad = totalWorkLoad/workersCount;
int extraLoad = totalWorkLoad % workersCount;
for (int i = 0; i < workersCount; i++)
{
int min, max;
if (i < (workersCount - 1))
{
min = (i * workLoad);
max = ((i * workLoad) + workLoad - 1);
}
else
{
min = (i * workLoad);
max = (i * workLoad) + (workLoad - 1 + extraLoad);
}
string name = "Working Thread#" + i;
Thread worker = new Thread(() => { action(min, max, name); });
worker.Name = name;
threads.Add(worker);
}
}
public void StartWorking()
{
foreach (Thread thread in threads)
{
thread.Start();
}
foreach (Thread thread in threads)
{
thread.Join();
}
}
}
下面是程序:
Stopwatch watch = new Stopwatch();
watch.Start();
int path = 1;
List<int> numbers = new List<int>(Enumerable.Range(0, 10000));
if (path == 1)
{
Parallel.ForEach(numbers, x =>
{
Console.WriteLine(x);
Thread.Sleep(1);
});
}
else
{
ThreadFactory workers = new ThreadFactory(10, numbers.Count, (min, max, text) => {
for (int i = min; i <= max; i++)
{
Console.WriteLine(numbers[i]);
Thread.Sleep(1);
}
});
workers.StartWorking();
}
watch.Stop();
Console.WriteLine(watch.Elapsed.TotalSeconds.ToString());
Console.ReadLine();
更新:
以鎖定考慮:我嘗試下面的代碼片段。同樣的結果,Parallel似乎要慢得多。
path = 1; cieling = 10000000;
List<int> numbers = new List<int>();
if (path == 1)
{
Parallel.For(0, cieling, x =>
{
lock (numbers)
{
numbers.Add(x);
}
});
}
else
{
ThreadFactory workers = new ThreadFactory(10, cieling, (min, max, text) =>
{
for (int i = min; i <= max; i++)
{
lock (numbers)
{
numbers.Add(i);
}
}
});
workers.StartWorking();
}
更新2: 只是一個快速更新,我的機器有四核處理器。所以並行有4個內核可用。
您不應該鎖定ForEach,它會在內部執行此操作。但是使用ReaderWriterLockSlim將使其再次變快;) – 2010-08-26 07:44:45
將您的ThreadFactory設置爲2個線程,並將Parallel.For上的最大併發設置爲2,擺脫Console.WriteLine並執行更合適的操作。現在他們如何比較?嘗試3和3; 4和4; ...在某些時候,Parallel.ForEach會決定分配足夠多的線程,並且分配的分配量不會超過您所說的最大值,但至少在這一點上,您將使用*相同數量的線程比較時間。 – 2010-08-26 08:00:58
@Hightechrider:好吧,就像我在我的問題中提到的那樣,我在測試中發現了質數,這個處理器相當密集,整個過程顯示100%的活動,並且發現ThreadFactory運行速度更快。試試看,我甚至嘗試設置線程數爲2,3等相同的結果。 – ace 2010-08-26 17:58:33