我使用C#作为一个研究工具,经常需要运行CPU密集型任务,例如优化。理论上,通过多线程编写代码,我应该能够获得大的性能提升,但实际上,当我使用与我的工作站可用核心数量相同的线程数时,通常发现CPU仍然只运行在最高性能的25%-50%。中断代码以查看所有线程正在执行的操作强烈表明内存分配是瓶颈,因为大多数线程将等待
一个解决方案是尝试重新设计所有代码以使其更加内存高效,但这将是一个庞大而耗时的任务。然而,由于我的工作站有充足的内存,我想知道是否可以通过设置不同的线程,使它们各自拥有私有的内存池来避开这个问题。当然,某些对象仍然需要在所有线程之间共享,否则将无法指定每个线程的任务或收集结果。
有人知道在C#中是否可以采用这种方法,如果可以,应该如何做呢?
new
语句执行。一个解决方案是尝试重新设计所有代码以使其更加内存高效,但这将是一个庞大而耗时的任务。然而,由于我的工作站有充足的内存,我想知道是否可以通过设置不同的线程,使它们各自拥有私有的内存池来避开这个问题。当然,某些对象仍然需要在所有线程之间共享,否则将无法指定每个线程的任务或收集结果。
有人知道在C#中是否可以采用这种方法,如果可以,应该如何做呢?
unsafe
块,您可以在其中使用stackalloc
并对分配发生的位置进行显式控制(但仅适用于结构实例,而不是类实例)。虽然这不是一个非常干净的解决方案,特别是如果它妨碍了代码的语义,这就是为什么我将其作为注释的原因。尽管如此,作为最后的手段,它可能会对您有所帮助。 - Theodoros Chatzigiannakis