C# i> 创建线程是一项相对昂贵的操作系统操作 上下文切换(CPU停止在一个线程上工作,开始在另一个线程上工作)也是一个相对昂贵的操作

C# i> 创建线程是一项相对昂贵的操作系统操作 上下文切换(CPU停止在一个线程上工作,开始在另一个线程上工作)也是一个相对昂贵的操作,c#,multithreading,C#,Multithreading,创建200个线程需要相当长的时间(默认堆栈大小仅为堆栈分配200MB内存),并且除非您的机器具有200个内核,否则操作系统也需要花费相当长的时间在这些线程之间切换上下文 最终的结果是,机器创建线程和在线程之间切换所花费的时间超过了机器执行任何工作所花费的时间。如果减少使用的线程数,您可能会看到性能的提高。尝试从机器的每个核心1个线程开始 多线程处理通常只在CPU等待事情发生(如磁盘IO或网络通信)的情况下才有用。这里的情况并非如此。线程并不总是更快,在许多情况下可能会更慢(如此处所示)。原因有很

创建200个线程需要相当长的时间(默认堆栈大小仅为堆栈分配200MB内存),并且除非您的机器具有200个内核,否则操作系统也需要花费相当长的时间在这些线程之间切换上下文

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


多线程处理通常只在CPU等待事情发生(如磁盘IO或网络通信)的情况下才有用。这里的情况并非如此。

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

  • 创建线程是一项相对昂贵的操作系统操作
  • 上下文切换(CPU停止在一个线程上工作,开始在另一个线程上工作)也是一个相对昂贵的操作
创建200个线程需要相当长的时间(默认堆栈大小仅为堆栈分配200MB内存),并且除非您的机器具有200个内核,否则操作系统也需要花费相当长的时间在这些线程之间切换上下文

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


多线程处理通常只在CPU等待事情发生(如磁盘IO或网络通信)的情况下才有用。这里不是这样。

建议什么?正如您所看到的,线程化和同步化都会带来开销。如何实现多线程化?线程不是免费的,也许你并行运行了太多的东西,导致了线程不足。你在线程中执行的内容似乎没有变化,或者我遗漏了什么?至于一个建议,按顺序去做。这似乎更快…建议你读一下。。一篇很棒的文章,介绍了多线程的性能粘贴您的普通(非线程)代码。。。只是一些猜测:线程有一个开销,很明显,您的TAK非常小,以至于开销被证明对性能有害。此外,您正在为每件事情创建新线程(在给定时间内,计算机上只能运行有限数量的线程。线程池可能会提高性能)。建议什么?正如您所看到的,线程化和同步化都会带来开销。如何实现多线程化?线程不是免费的,也许你并行运行了太多的东西,导致了线程不足。你在线程中执行的内容似乎没有变化,或者我遗漏了什么?至于一个建议,按顺序去做。这似乎更快…建议你读一下。。一篇很棒的文章,介绍了多线程的性能粘贴您的普通(非线程)代码。。。只是一些猜测:线程有一个开销,很明显,您的TAK非常小,以至于开销被证明对性能有害。此外,您正在为每件事情创建新线程(在给定时间内,一台计算机上只能运行有限数量的线程。线程池可能会提高性能)。
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++;
}