c# 定位内存快速增长_c#如何避免内存分配瓶颈以提高多线程性能

我使用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,memory-management,multithreading,heap-memory,performance

来源: https://codeday.me/bug/20190529/1177267.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值