0

我在我的 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 秒的线程它需要更多...

有人可以建议我吗?

谢谢...

4

5 回答 5

2

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

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

创建 200 个线程将花费大量时间(使用默认堆栈大小,这将仅为堆栈分配 200MB 内存),除非您有一台具有 200 个内核的机器,否则操作系统还需要花费大量时间进行上下文切换这些线程之间也是如此。

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

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

于 2012-08-03T15:40:00.123 回答
1

线程并不总是解决方案,而且您使用它的方式绝对不是线程安全的。在某些情况下,诸如磁盘 I/O 或其他瓶颈之类的事情不会从线程中受益。

此外,启动线程也是有成本的。并不是说我会根据您的情况推荐它,但请查看 TPL。http://msdn.microsoft.com/en-us/library/dd460717.aspx

于 2012-08-03T15:27:04.537 回答
0

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

如果你有一个Beowulf 集群,你可以将线程共享到单独的机器上,你可能会得到很好的时机。但是您的机器仅使用 4 个处理器无法做到这一点。你要求它做的越多,性能就会越差。

于 2012-08-03T15:39:39.960 回答
0

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

对于并行执行的商品,我们以性能为代价。

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

在您的具体场景中,很难提出真实的建议。

可能你可以考虑多进程执行,而不是多线程执行。

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

于 2012-08-03T15:29:16.630 回答
0

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

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

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

如果线程中的工作不需要太多时间,那么最好使用单线程。

于 2012-08-03T15:35:37.593 回答