1

我有一种情况,我在我经常使用的函数(可能每秒 30 次)上使用 AllocHGlobal(总是大小相同),在我调用 FreeHGlobal 的函数结束时

如果我保留使用 AllocHGlobal 分配的内存部分并在类 Dispose 时释放它,或者我应该在每次调用函数时分配/释放它会更好吗?

我不知道这个内存在 c# 中的表现如何,对我来说这是一个“新世界”

4

3 回答 3

2

30秒是永恒的。将 FreeHGlobal 放在 finally 块中以确保它被释放要容易得多。使您不必做终结器和 IDisposable 歌舞。好吧,客户的代码。

在堆搅动中偏爱缓存并不会开始得到回报,直到它进入毫秒范围。

于 2011-01-04T23:34:53.187 回答
1

与任何性能问题一样 - 首先编写干净的代码,测量和优化所需的内容。

如果您非常确定您的对象将永远不会被多个线程使用(从而同时调用相关函数),那么缓存分配的内存似乎很好。

如果您决定缓存依赖垃圾收集的未管理的内存块,则可能不足以足够早地释放内存。未管理的内存 (AllocHGlobal) 不计入 CLR 分配的内存,因此可能会延迟对象的垃圾收集)。您应该在您的对象上实现并正确使用 IDisposable。

于 2011-01-04T23:40:25.827 回答
0

您可以这样做,只要:

  • 所需的内存量始终小于或等于分配的大小。(您已经表明是这种情况。)
  • 一次不会从多个线程调用该方法。
  • 该方法不可重入。
  • 当不再需要内存时,您会小心释放内存。(换句话说,如果指针保存在非静态类字段上,则该类应该实现IDisposable并且该Dispose()方法应该释放内存。当然,类消费者将不得不调用Dispose()或使用using(){}块。)

但是,P/Invoke 调用的实际编组更有可能成为瓶颈。您是否真正分析过代码,或者您是否在进行微优化?

于 2011-01-04T23:34:22.270 回答