c#中的核心利用率

时间:2013-10-15 14:02:02

标签: c# multithreading

我编写了一个程序,它读取WAV文件并收集各种数据然后进行某些计算并输出我需要的任何有用信息(终点是语音鉴别器)。这一切都是针对单独的类对象中的每个文件单独发生的,每个文件只需要一个不同的输入字符串,所以我想我可以很容易地将应用程序线程化,我可以让它运行速度快四倍。

我已经完成了,它看起来效果很好。但是,当我来到应用程序(线程与非线程)时,我只用了大约3秒就能完成~3600个文件。我最好的猜测是文件I / O,我会看到所有测试都有更大的改进,但这不是我特别感兴趣的。

在Win7上打开任务管理器后,两个版本的应用程序在我的i3机器上的所有四个(虚拟)内核上显示类似的活动,然后在完成时降至最低。

所以我的问题:c#编译器,特别是Visual Studio,是否已经针对多个内核进行了优化?如果没有,我是否错过了一些基本的东西?

2 个答案:

答案 0 :(得分:1)

您正在寻找TPL;任务并行库。

具体来说,您可以使用Parallel.ForEach语句来处理文件。

见这里:http://msdn.microsoft.com/en-us/library/dd460720.aspx

答案 1 :(得分:0)

如果没有更多详细信息,很难回答你的问题,但是如果你正确地实现了各种线程函数并为你正在运行代码的硬件使用适当数量的线程,那么你的CPU利用率应该在线程实现中很好

如果您不使用多个线程进行处理,您的程序将使用单个CPU /单核 - 如果您正在询问,编译器不会重新排列多个线程的代码。

如果您看到单线程和多线程代码的CPU利用率相同,可能有很多原因(只是因为我不知道您的代码而猜测):

  • 您使用太少/太多线程
  • 磁盘I / O非常多,线程的所有收益都被淘汰
  • 您的系统上运行了许多其他进程/线程,它们会干扰您的测量

可能还有其他一些原因,但正如Allan Elder的回答所提到的那样,您可以试试Parallels库 - 它会尝试根据各种因素为您的代码选择最佳线程数。它使得使用线程变得更加简单,因为为你完成了连接线程的样板代码。

当我对图像文件进行类似处理时,使用多个线程将处理时间减少了40%(尽管我将大多数图像加载到内存中 - 它们不是流式处理所以I / O不是那么多因素) 。在我的情况下,多线程方法的核心利用率也要好得多 - 它是8核与1核。