我正在开发一个处理许多请求的程序,它们都没有超过50%的CPU(目前我正在研究双核).所以我为每个请求创建了一个线程,整个过程更快.处理9个请求,单个线程持续02min08s,同时3个线程同时工作,时间减少到01min37s,但它不使用100%CPU,只有大约50%.
我怎么能让我的程序使用完整的处理器功能?
编辑 应用程序不是IO或内存有限,它们始终处于合理的水平.
我认为它与'双核'事物有关.
有一个锁定的方法调用,每个请求使用,但它真的很快,我不认为这是问题.
我的代码中代价更高的部分是通过COM调用dll(从所有线程调用相同的外部方法).这个dll也没有内存或IO限制,它是一个AI识别组件,我正在进行OCR识别薪水,支票请求.
EDIT2
STA COM方法很可能是我的问题,我联系了组件所有者以解决这个问题.
您的申请中是否有重大锁定?如果线程相互等待很多,那很容易解释它.
除此之外(以及给出的其他答案),真的很难猜到.探查器是你的朋友......
编辑:好的,鉴于下面的评论,我想我们正在做点什么:
我的代码中代价更高的部分是通过COM调用dll(从所有线程调用相同的外部方法).
COM方法是否在STA中运行?如果是这样,它将只使用一个线程,序列化调用.我强烈怀疑这是关键.它类似于锁定该方法调用(不可否认,不完全相同).
问题是COM对象.
大多数COM对象在"单线程单元"的上下文中运行.(您可能不时在.NET应用程序的main方法上看到[STAThread]注释?)
实际上,这意味着对该对象的所有调度都由单个线程处理.在问题上投入更多内核只会为您提供更多资源,可以在.NET中等待或执行其他操作.
您可能想看看Joe Duffy(微软的并行.NET主管)关于该主题的这篇文章.
http://www.bluebytesoftware.com/blog/PermaLink,guid,8c2fed10-75b2-416b-aabc-c18ce8fe2ed4.aspx
实际上,如果你必须针对像这样的单个COM对象做一些事情,那么你就会受到冲击,因为.NET只会在你的背后内部序列化访问模式.如果您可以创建多个COM对象并使用它们,则可以解决该问题,因为可以从不同的STA线程创建和访问每个对象.这将一直有效,直到你达到大约100个STA线程,然后事情会变得很糟糕.有关详细信息,请参阅文章.
处理器可能不再是完成流程的瓶颈.瓶颈可能转移到磁盘访问,网络访问或内存访问.您还可能遇到线程争用锁定的情况.
只有你确切地知道你的线程在做什么,所以你需要考虑到上面的内容.