c# 定位内存快速增长_c#如何避免内存分配瓶颈以提高多线程性能
我使用C#作為研究工具,經(jīng)常需要運(yùn)行CPU密集型任務(wù),例如優(yōu)化.從理論上講,我應(yīng)該能夠通過多線程化代碼來提高性能,但實(shí)際上當(dāng)我使用與工作站上可用內(nèi)核數(shù)量相同的線程數(shù)時(shí),我通常會發(fā)現(xiàn)CPU仍然只運(yùn)行在25 %-50%的最大值中斷代碼以查看所有線程正在做什么強(qiáng)烈建議內(nèi)存分配是瓶頸,因?yàn)榇蠖鄶?shù)線程將等待新語句執(zhí)行.
一種解決方案是嘗試重新設(shè)計(jì)我的所有代碼,以提高內(nèi)存效率,但這將是一項(xiàng)龐大而耗時(shí)的任務(wù).但是,由于我的工作站上有大量內(nèi)存,我想知道我是否可以通過設(shè)置不同的線程來回避這個(gè)問題,這樣他們每個(gè)人都有自己的私有內(nèi)存池來工作.當(dāng)然,某些對象仍然需要在所有線程之間公開,否則將無法為每個(gè)線程指定任務(wù)或收集結(jié)果.
有誰知道在C#中這種方法是否可行,如果有的話,我應(yīng)該怎么做呢?
解決方法:
如果您有內(nèi)存分配瓶頸,您應(yīng)該:
>使用“對象池”(如@MartinJames所說).應(yīng)用程序啟動時(shí)初始化對象池.對象池應(yīng)該提高堆分配的性能.
>使用結(jié)構(gòu)(或任何值類型)作為局部變量,因?yàn)槎褩7峙浔榷芽斓枚?
>避免隱式內(nèi)存分配.例如,當(dāng)您將項(xiàng)目添加到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).
>避免拳擊.這個(gè)很貴:
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表達(dá)式(因?yàn)閷椴东@的變量創(chuàng)建新對象)
標(biāo)簽:c,memory-management,multithreading,heap-memory,performance
來源: https://codeday.me/bug/20190529/1177267.html
總結(jié)
以上是生活随笔為你收集整理的c# 定位内存快速增长_c#如何避免内存分配瓶颈以提高多线程性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab径向分布函数作图_常见的概率
- 下一篇: django可以生成exe文件吗_把 D