【问题标题】:.net Fast Memory Allocation.net 快速内存分配
【发布时间】:2011-04-12 22:06:16
【问题描述】:

在我的应用程序中,有些情况下对象相对较小(最多 50 个字节),例如用于记录目的的消息类,必须在程序执行期间频繁地创建和释放(由 GC)。所以我担心动态分配这些对象的开销。正如question 中所述,有一些可用于本机代码的快速内存分配器。
.Net 中是否有快速内存分配的概念,或者 .Net 中是否需要快速内存分配?如果不是,可以用什么来加速这种实现? (可能是某种预先分配的对象池。)我应该担心开销吗?

【问题讨论】:

  • 1) 让它发挥作用。 2)如果它很慢,让它工作得更快。

标签: .net memory memory-management dynamic-memory-allocation


【解决方案1】:

您不应该担心开销,除非并且直到您的分析器为您提供确凿的数据来支持您的担忧。

我想您可能能够使用unsafe 代码实现分配器,但是费力和努力值得吗?你必须配置文件才能知道。

【讨论】:

  • 那么当我配置文件时,我应该如何知道我的实现是否足够快?我没有其他选择可以比较。
  • 这是我刚刚编造的一句话:“如果客户不抱怨,那就足够快了”。
【解决方案2】:

因为它应该是一个设计良好的内存分配器,所以只有 一种 方法来分配垃圾回收的内存。它非常快,分配只需要调整一个指针。比本机代码必须使用的分配器快得多。这样做的难度要大得多,一旦分配了本机内存,它就不能再移动了。这使得编写不受碎片影响的分配器变得困难。对策增加了开销。在 GC 堆中不是问题,它可以压缩。

你无法提高 GC 分配器的速度。

【讨论】:

  • 感谢您的启发性技术回答。我希望我可以多次投票
  • 在实践中,分配速度本身并不重要。重要的是分配和收集的综合成本。而且估算收款成本很复杂。
  • @CodeInChaos:在本机代码中,在某些情况下它确实很重要。这个问题的目的是了解托管分配是否类似于本机分配。感谢@Hans,我知道 GC 分配已经很快了。我相信他对你的评论有话要说。
【解决方案3】:

如果对象很小且寿命很短,我不会太担心。它们最有可能通过 Gen0 GC 收集,这通常相对便宜。

你可以实现一个池,但根据我的经验,这只有在你分配大对象时才有必要(如果我没记错的话,如果对象大于大约 80kB,则它们被放置在大对象堆上)或 非常 许多(每秒数百万)个对象。

所以先正常实现吧。只有当你看到你的程序在 GC 中花费了大量时间时,你才应该担心你的分配。您很可能正在考虑过早优化。

【讨论】:

  • 我不认为这是一个过早的优化。因为事实是链接问题中提供的那些分配器比传统的malloc() 快得多,因此更适合任务调度或消息传递实现。英特尔 TBB 的任务调度确实完全依赖于其分配器的速度。
  • 那么每秒需要分配多少个对象呢?分配本身在 .net 中实际上是免费的,问题中的集合。如果分析确实表明集合是您的瓶颈,则切换池很容易。我还是说你应该先用标准分配来写,必要时才做更复杂的事情。
猜你喜欢
  • 2013-07-27
  • 2021-03-09
  • 1970-01-01
  • 2012-12-26
  • 2015-12-08
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
相关资源
最近更新 更多