gpt4 book ai didi

c# - Parallel.Invoke 什么时候有用?

转载 作者:行者123 更新时间:2023-11-30 19:31:30 27 4
gpt4 key购买 nike

我正深入了解 4.0 框架中的 Parallel 类,并试图了解它何时有用。起初,在查看了一些文档后,我尝试执行两个循环,一个使用 Parallel.Invoke,另一个像这样顺序执行:

static void Main()
{
DateTime start = DateTime.Now;
Parallel.Invoke(BasicAction, BasicAction2);
DateTime end = DateTime.Now;
var parallel = end.Subtract(start).TotalSeconds;

start = DateTime.Now;
BasicAction();
BasicAction2();
end = DateTime.Now;
var sequential = end.Subtract(start).TotalSeconds;

Console.WriteLine("Parallel:{0}", parallel.ToString());
Console.WriteLine("Sequential:{0}", sequential.ToString());
Console.Read();
}
static void BasicAction()
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine("Method=BasicAction, Thread={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i.ToString());
}
}

static void BasicAction2()
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine("Method=BasicAction2, Thread={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i.ToString());
}
}

此处的执行时间没有明显差异,还是我没捕获要点?它对 Web 服务的异步调用更有用还是...?

编辑:我用秒表删除了DateTime,通过简单的加法操作删除了对控制台的写入。

更新 - 现在大时差:感谢您解决我在使用控制台时遇到的问题

static void Main()
{
Stopwatch s = new Stopwatch();
s.Start();
Parallel.Invoke(BasicAction, BasicAction2);
s.Stop();
var parallel = s.ElapsedMilliseconds;

s.Reset();
s.Start();
BasicAction();
BasicAction2();
s.Stop();

var sequential = s.ElapsedMilliseconds;

Console.WriteLine("Parallel:{0}", parallel.ToString());
Console.WriteLine("Sequential:{0}", sequential.ToString());
Console.Read();
}

static void BasicAction()
{
Thread.Sleep(100);

}

static void BasicAction2()
{
Thread.Sleep(100);
}

最佳答案

你做的测试是无意义的;您正在测试无法并行执行的事情如果您并行执行它是否会更快。

Console.Writeline 为您处理同步,因此它始终表现得好像在单个线程上运行。

来自 here :

...call the SetIn, SetOut, or SetError method, respectively. I/O operations using these streams are synchronized, which means multiple threads can read from, or write to, the streams.

并行版本通过在多线程上运行获得的任何优势都会因控制台完成的编码而丢失。事实上,如果看到所有线程切换实际上意味着并行运行将变慢,我不会感到惊讶。

尝试在 可以 由多个线程同时处理的操作中执行其他操作(一个简单的 Thread.Sleep 就可以),您应该会看到运行时间的巨大差异。足够大,使用 DateTime 作为计时机制的不准确性不会有太大影响。

关于c# - Parallel.Invoke 什么时候有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7148964/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com