并行 For 循环与 C# 中的简单 for 循环。速度测试
Parallel For loop versus simple for loop in c#. Speed test
我不确定是否应该使用 Parallel.For()。我做了一个简单的测试,结果强烈反对并行化。在什么情况下以及如何正确使用 Parallel.For() 和 PLinq?这是我的测试代码:
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 更快吗?
运行release模式不调试的解决方法
我的系统有四个核心,我可以使用任务管理器看到:
而且基准测试确实快了四倍:
请注意,默认情况下,您不会在 Windows 10 中启用多核。您必须从“开始”菜单中 运行 msconfig,并在“启动”菜单中启用多个处理器:
我不确定是否应该使用 Parallel.For()。我做了一个简单的测试,结果强烈反对并行化。在什么情况下以及如何正确使用 Parallel.For() 和 PLinq?这是我的测试代码:
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 更快吗?
运行release模式不调试的解决方法
我的系统有四个核心,我可以使用任务管理器看到:
而且基准测试确实快了四倍:
请注意,默认情况下,您不会在 Windows 10 中启用多核。您必须从“开始”菜单中 运行 msconfig,并在“启动”菜单中启用多个处理器: