我使用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#如何避免内存分配瓶颈以提高多线程性能


基础教程推荐
- 实例详解C#实现http不同方法的请求 2022-12-26
- Unity shader实现高斯模糊效果 2023-01-16
- C#获取指定目录下某种格式文件集并备份到指定文件夹 2023-05-30
- C#调用摄像头实现拍照功能的示例代码 2023-03-09
- C# 解析XML和反序列化的示例 2023-04-14
- Unity 如何获取鼠标停留位置下的物体 2023-04-10
- C#中的Linq to JSON操作详解 2023-06-08
- C#中 Json 序列化去掉null值的方法 2022-11-18
- c# – USING块在网站与Windows窗体中的行为不同 2023-09-20
- C#通过标签软件Bartender的ZPL命令打印条码 2023-05-16