我對我是否應該使用Parallel.For()有一些疑問。我做了一個簡單的測試,它強烈反對並行化。在什麼情況下以及如何正確使用Parallel.For()和PLinq?這裏是我的測試代碼:並行For循環與簡單for循環在C#中。速度測試
class Wrapper
{
public void Sequential()
{
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
{
DauntingOp(i);
DauntingOp(i + 9000);
DauntingOp(i - 8521);
DauntingOp(i);
DauntingOp(i + 9000);
DauntingOp(i - 8521);
}
Console.WriteLine("For = ms: {0}", sw.ElapsedMilliseconds);
}
public void ParallelFor()
{
Stopwatch sw = Stopwatch.StartNew();
Parallel.For(0, 1000, (elem) =>
{
DauntingOp(elem);
DauntingOp(elem + 9000);
DauntingOp(elem - 8521);
DauntingOp(elem);
DauntingOp(elem + 9000);
DauntingOp(elem - 8521);
});
Console.WriteLine("Parallel For = ms: {0}", sw.ElapsedMilliseconds);
}
private void DauntingOp(int index)
{
try
{
long val = index;
for (int i = 0; i < 1000; i++)
{
long a = val + 345678;
long b = a + 4567;
long c = a - b;
long d = long.Parse(new Random().Next().ToString());
long x = d - a - b - c;
long y = long.Parse(new Random().Next().ToString()) - (long.Parse(new Random().NextDouble().ToString()) + 345 - x);
}
}
catch { }
finally
{
try
{
long a = 345678;
long b = a + 4567;
long c = a - b;
long d = long.Parse(new Random().Next().ToString());
long x = d - a - b - c;
long y = long.Parse(new Random().Next().ToString()) - (long.Parse(new Random().Next().ToString()) + 345 - x);
}
catch { }
}
}
}
class Program
{
static void Main(string[] args)
{
Wrapper wrapper = new Wrapper();
wrapper.Sequential();
wrapper.ParallelFor();
Console.Read();
}
}
結果:
For = ms: 22645
Parallel For = ms: 29020
不應該的Parallel.For更快?
我要說的是,管理並行循環的成本outweighing工作的成本在這種情況下,正在做。如果你正在做的事情需要更長時間,例如連接到數據庫並在事務中插入一些記錄,那麼你可能會發現並行循環更快。順便說一句,對於將i + 9000傳遞給DauntingOp的情況,該方法不會在try中執行任何操作,因爲index已經是1000+,因此這些調用不會爲您的測試添加任何有意義的內容。 – DeanOC
我在你的機器上運行你的代碼,差異很小。我剛剛啓用了多個內核;我會重新啓動並重試,然後再回到你身邊。 –
這取決於您的CPU有多少個內核。如果它的單核心然後並行的將由於線程上下文切換的開銷而工作得更慢。 – serhiyb