多线程比C#中的顺序执行花费更多时间

时间:2012-08-03 15:23:34

标签: c# multithreading

我在while循环中使用多线程, 如

while(reader.read())
{
 string Number= (reader["Num"] != DBNull.Value) ? reader["Num"].ToString() : string.Empty;
  threadarray[RowCount] = new Thread(() =>
  {

  object ID= (from r in Datasetds.Tables[0].AsEnumerable()
                                            where r.Field<string>("Num") == Number
                                            select r.Field<int>("ID")).First<int>();


 });

                threadarray[RowCount].Start();
                RowCount++;
}

但是对于顺序执行,200个读者只需要0.4秒 但是使用线程需要1.1秒......这是一个例子,但是当我使用多行数据库操作的线程中的多行代码执行它时,我遇到同样的问题。

对于顺序,线程需要10秒才需要更多...

任何人都可以建议我吗?

...谢谢

5 个答案:

答案 0 :(得分:2)

线程并不总是更快,在许多情况下可能会更慢(例如此处所见的情况)。有很多原因,但最重要的两个是

  • 创建线程是一项相对昂贵的操作系统操作
  • 上下文切换(CPU停止在一个线程上工作并开始在另一个线程上工作)又是一个相对昂贵的操作

创建200个线程将花费相当长的时间(使用默认堆栈大小,这将仅为堆栈分配200MB内存),除非您拥有具有200个内核的计算机,否则操作系统还需要花费相当多的时间这些线程之间的时间上下文切换。

最终结果是机器花费时间创建线程并在它们之间切换只是超过了机器花费在任何工作上的时间。如果减少使用的线程数,可能会看到性能提升。尝试从机器所拥有的每个核心开始使用1个线程。

线程多于核心的多线程通常仅在CPU等待事情发生(如磁盘IO或网络通信)的情况下才有用。这不是这种情况。

答案 1 :(得分:1)

线程并不总是解决方案,你使用它的方式绝对不是线程安全的。在某些情况下,磁盘I / O或其他瓶颈等问题无法从线程中受益。

此外,启动线程需要付费。不是我会根据你的情况推荐它,而是查看TPL。 http://msdn.microsoft.com/en-us/library/dd460717.aspx

答案 2 :(得分:0)

多线程通常非阻塞执行的选择。就像地球上的一切一样,它有相关的成本。

对于并行执行的商品,我们支付业绩。

通常没有什么比顺序执行单个任务更快。

具体的场景中,很难提出真实的内容。

您可以考虑多个进程执行,而不是多个线程执行。

但我重申,如果不了解应用程序的完整架构和要求,很难判断您是否会从中受益。

答案 3 :(得分:0)

似乎你正在为每个read()创建一个线程。因此,如果它有200个read(),则运行200个线程(可能更少,因为有些线程可能很快完成)。取决于你在线程中做了什么,同时运行的200个线程实际上可能会因为其他人提到的开销而减慢系统速度。

multuthread可以帮助你1)线程中的工作需要一些时间才能完成; 2)您可以控制同时运行的线程数。

在你的情况下,你需要尝试,比如10个线程。如果10个线程正在运行,请等待其中1个线程完成,然后将线程分配给新的read()。

如果线程中的作业没有花费太多时间,那么最好使用单线程。

答案 4 :(得分:0)

Sci Fi作者和技术专家Jerry Pournelle曾经说过,在一个理想的世界中,每个进程都应该拥有自己的处理器。这不是一个理想的世界,你的机器可能有1-4个处理器。即使你自己做白日梦,你的Windows系统也会运行大量进程。我只计算了我的Core 2 Quad XP机器上运行的进程,SYSTEM正在运行65个进程。这是必须在4个处理器之间共享的65个进程。添加更多线程,每个线程只获得一块处理器能力。

如果你有一个Beowulf Cluster,你可以将线程分享到各个机器上,你可能会得到非常好的时间。但是你的机器只能用4个处理器才能做到这一点。你要求的越多,性能就会越差。

相关问题