0

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

我已经这样做了,它似乎工作得很好。但是,当我开始计算应用程序(线程与非线程)时,我在一分钟内只获得了大约 3 秒的时间来处理约 3600 个文件。我对此的最佳猜测是文件 I/O,我会看到所有测试的实现都有更大的改进,但这不是我特别感兴趣的。

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

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

4

2 回答 2

1

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

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

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

于 2013-10-15T14:06:28.103 回答
0

没有更多细节很难回答您的问题,但是如果您以其他方式正确实现了各种线程功能并为运行代码的硬件使用了适当数量的线程,那么您的 CPU 利用率在线程实现中应该会很好。

如果您不使用多个线程进行处理,那么您的程序将使用单个 CPU/单个内核 - 如果您要的是,编译器不会为多个线程重新排列您的代码。

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

  • 您使用的线程太少/太多
  • 磁盘 I/O 太多以至于线程的所有收益都被洗掉了
  • 您的系统上运行着许多其他进程/线程,它们会干扰您的测量

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

当我对图像文件进行类似处理时,使用多个线程将我的处理时间减少了 40%(尽管我将大多数图像加载到内存中——它们不是流式传输的,因此 I/O 并不是一个重要因素)。在我的例子中,多线程方法的核心利用率也好得多——它是 8 核与 1 核。

于 2013-10-15T14:06:46.760 回答