【问题标题】:Is it possible to resize a generic object pool?是否可以调整通用对象池的大小?
【发布时间】:2013-04-29 15:47:33
【问题描述】:

我正在 ARM 设备上使用实时应用程序。性能很重要,所以我使用了一个通用的 ObjectPool 类。

到目前为止,我会将池预分配到我可以预期的最大大小,但现在我遇到了绝对必须调整池大小的情况。

查看了网络和 SO 的许多解决方案后,我注意到调整大小始终是触发 GC 的数组复制操作。我认为这没问题,但现在开始看到性能影响确实很重要。

是否有真正的可调整大小的对象池解决方案/模式可以产生零垃圾?

【问题讨论】:

  • 如果您绝对必须拥有零垃圾,那么 ObjectPool 实例的链表或树可能会起作用。但是,您可能会失去任何实时保证。 (找到一个实例至少可以变成一个线性或对数时间操作。)“调整大小”数组只是创建一个新数组(要求最终收集旧数组),而典型池的核心将是一组实例引用...因此您需要创建一个新池而不是调整现有池的大小。

标签: c# .net garbage-collection arm


【解决方案1】:

我将编写一个在内部使用链表的对象池。这将允许您的池增长到需要的大小。并且池应该从该链表的开头添加和删除。反过来,这将保证在压力较低时重复使用相同的对象。

另一方面,构建和/或拆除这些对象是否昂贵?因为首先使用池的一个原因是管理创建和销毁昂贵的对象。

使用池的另一个关键原因是重用对象,您几乎总是从池中获取第一个对象,并希望这些对象在 cpu 缓存中可用。您用完池中的对象这一事实表明,拥有该池并没有太多好处。

所以我的建议是,在开始对新对象池进行编码之前,也许您应该尝试删除该池,看看当您让 GC 发挥作用时这会如何影响性能。

【讨论】:

  • 很好奇你做了什么。使用了链表还是删除了池?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2017-11-06
相关资源
最近更新 更多