c#如何避免内存分配瓶颈以提高多线程性能

我使用C#作为研究工具,经常需要运行CPU密集型任务,例如优化.从理论上讲,我应该能够通过多线程化代码来提高性能,但实际上当我使用与工作站上可用内核数量相同的线程数时,我通常会发现CPU仍然只运行在25 %-50%的最大...

我使用C#作为研究工具,经常需要运行CPU密集型任务,例如优化.从理论上讲,我应该能够通过多线程化代码来提高性能,但实际上当我使用与工作站上可用内核数量相同的线程数时,我通常会发现CPU仍然只运行在25 %-50%的最大值中断代码以查看所有线程正在做什么强烈建议内存分配是瓶颈,因为大多数线程将等待新语句执行.

一种解决方案是尝试重新设计我的所有代码,以提高内存效率,但这将是一项庞大而耗时的任务.但是,由于我的工作站上有大量内存,我想知道我是否可以通过设置不同的线程来回避这个问题,这样他们每个人都有自己的私有内存池来工作.当然,某些对象仍然需要在所有线程之间公开,否则将无法为每个线程指定任务或收集结果.

有谁知道在C#中这种方法是否可行,如果有的话,我应该怎么做呢?

解决方法:

如果您有内存分配瓶颈,您应该:

>使用“对象池”(如@MartinJames所说).应用程序启动时初始化对象池.对象池应该提高堆分配的性能.
>使用结构(或任何值类型)作为局部变量,因为堆栈分配比堆快得多.
>避免隐式内存分配.例如,当您将项目添加到List<>:

If Count already equals Capacity, the capacity of the List is
increased by automatically reallocating the internal array, and the
existing elements are copied to the new array before the new element
is added (source MSDN).

>避免拳击.这个很贵:

In relation to simple assignments, boxing and unboxing are
computationally expensive processes. When a value type is boxed, a new
object must be allocated and constructed. To a lesser degree, the cast
required for unboxing is also expensive computationally. (source MSDN)

>避免使用捕获变量的lambda表达式(因为将为捕获的变量创建新对象)

本文标题为:c#如何避免内存分配瓶颈以提高多线程性能

基础教程推荐