使用Parallel.For来测试SQL查询并与ThreadPool进行比较

时间:2008-12-08 13:12:44

标签: c# multithreading performance parallel-processing threadpool

我正在寻找一种方法来轻松加载测试和基准测试我们的一些SQL(使用ADO.NET,没有任何花哨的使用LINQ或PLINQ),在高并行负载下运行时必须具有高性能。

我曾考虑使用新的并行扩展CTP,特别是Parallel.For / Parallel.ForEach来简单地运行SQL超过10k次迭代 - 但我无法找到任何数据这些都已经过优化。

基本上我担心因为数据库访问本质上是I / O绑定的,所以它不会产生足够的负载。有没有人知道是否并行。因为足够智能使用> x个线程(其中x = CPU的数量),如果它正在执行的任务不完全受CPU限制?即它的行为方式与托管线程池类似吗?

如果真的那么会很酷!

编辑:正如@CVertex在下面提到的那样,您可以单独设置线程数。有没有人知道默认情况下并行库是否足够智能,以便在作业受I / O限制时继续添加线程?

2 个答案:

答案 0 :(得分:1)

当然可以!

您可以指定所需的每个CPU的最大线程数。

在你并行之前。无论你在做什么,你都必须从System.Threading.Tasks命名空间中实例化你自己的TaskManager。 查看ctor参数,了解如何根据自己的需要自定义任务管理器。

Parallel.For应该有一个重载,它需要一个任务管理器实例。

答案 1 :(得分:0)

另一种方法是定义PLINQ_DOP环境变量。来自文档:

PLINQ_DOP
DOP stands for degree of parallelism. Setting this environment variable defines the number of threads for PLINQ to use. 
E.g. PLINQ_DOP=1 means single-threaded, while PLINQ_DOP=8 means PLINQ should use 8 threads. 
If this is set to a value greater than the number of procs*cores available on the system, 
PLINQ will use more threads than processors. If one of them blocks, for instance, 
this allows other threads to make forward progress.