是否有可能使用LINQ自定义的内存分配器?

问题描述 投票:1回答:1

有没有使用LINQ自定义的内存分配器的方法吗?

例如,当我打电话:

someCollection.Where(x).SelectMany(y).ToList();

ToList()OrderBy()方法将总是创建一个新的数组,所以很多GC会发生。通过自定义分配器,我可以总是使用相同的列表,这将被清零,重新填充每次。 IAM知道,重用缓冲区可能导致重入的问题。

其背景是,我的应用程序是一个游戏,GC是指口吃。请不要告诉我“使用C ++而不是”或“不使用LINQ”,我知道:)

c# .net linq memory-management
1个回答
1
投票

(虽然你不愿提出反对的话,我瘦这个答案可以帮助社区)

LINQ是建立在顶部的CLR的设施,因此它使用CLR分配,而且不能更改。你可以调整它一点点,例如配置GC周期是否应该被卸载到后台线程,但你不能再往前走。

LINQ的目的是简单地写为一定阶级的牺牲自由选择每个结构单元中的执行问题的代码(这就是为什么我们通常选择LINQ)。

然而,根据该方案,LINQ不可能是你最好的朋友为它的设计选择可能对你的发挥。如果,剖析你的代码后,你确定你有一个严重的性能问题,你应该尝试首先确定你是否能隔离在一些LINQ方法的瓶颈,看看你是否可以推出自己的实现,通过扩展方法。当然,这个选择是可行的,当宥是主要的来电者,除非你管理滚东西是IEnumerable投诉。你必须要很幸运,因为您的实现应该恪守LINQ规则。特别是,当你不在的对象是如何操作的控制,你不能在自己的代码执行你所要说的优化。封锁和对你延迟执行的工作。

否则,什么已经被评论认为是唯一可行的办法:避免使用LINQ针对特定的任务。

原因辞去LINQ远的是,它不是解决你所需要的性能约束你的问题的工具。另外,如在评论中所述,(AB)使用lambda表达式的显著增加内存压力,在创建背衬对象来实现封闭件。

我们不得不与你类似的,在这里我们不得不重写某些慢路径的性能问题。在其他(罕见)的情况下,预先分配列表和加载结果通过AddRange帮助。

© www.soinside.com 2019 - 2024. All rights reserved.