【发布时间】:2013-01-29 21:00:42
【问题描述】:
我有一个 for 循环,它创建 4 个任务,每个任务打印其循环索引 - 用于测试性能的简单程序
我有一个外部循环运行上述循环 1000 次(迭代) 我想检查 TASKs 和 Threads 的性能
(1) 测试 1:我认为这只会创建 TASK(不是线程),但我发现它使用 TPL
tasks[i] = Task.Factory.StartNew(() => Console.WriteLine(tmp));
(2)我用TaskCreationOptions.LongRunning重写如下
tasks[i] = Task.Factory.StartNew(() => Console.WriteLine(tmp), TaskCreationOptions.LongRunning);
(3) 然后我尝试使用与上面相同的代码而不是任务测试线程,但现在使用“新线程”而不是工厂
for (int i = 0; i < 4; i++)
{
var tmp = i;
tasks[i] = new Thread(new ThreadStart(() => Console.WriteLine(tmp)));
tasks[i].Start();
tasks[i].Join();
}
时序结果显示最好的性能是(2),然后是(3),然后是(1)
请解释一下性能结果的原因,并解释一下上面哪一个真正只是一个任务(一个OS进程),哪些正在使用线程?
我尝试使用探查器,但只能访问 Visual Studio 2010 Professional,而且探查器似乎只附带 permium 或 Ultimate 版本。
【问题讨论】:
-
三个问题,你有没有尝试过更多的循环?你在发布时运行它吗?你是如何衡量所有的?
-
“以上哪一项真正只是一项任务(操作系统进程)”
Tasks 和Processes 是完全不同的东西。如果你想运行一些代码,你必须使用一些线程。 -
选项 3 具有创建线程的所有开销,但没有任何好处。迭代将在新创建的线程上按顺序运行。
标签: .net task-parallel-library