我有一种情况,我在我经常使用的函数(可能每秒 30 次)上使用 AllocHGlobal(总是大小相同),在我调用 FreeHGlobal 的函数结束时
如果我保留使用 AllocHGlobal 分配的内存部分并在类 Dispose 时释放它,或者我应该在每次调用函数时分配/释放它会更好吗?
我不知道这个内存在 c# 中的表现如何,对我来说这是一个“新世界”
我有一种情况,我在我经常使用的函数(可能每秒 30 次)上使用 AllocHGlobal(总是大小相同),在我调用 FreeHGlobal 的函数结束时
如果我保留使用 AllocHGlobal 分配的内存部分并在类 Dispose 时释放它,或者我应该在每次调用函数时分配/释放它会更好吗?
我不知道这个内存在 c# 中的表现如何,对我来说这是一个“新世界”
30秒是永恒的。将 FreeHGlobal 放在 finally 块中以确保它被释放要容易得多。使您不必做终结器和 IDisposable 歌舞。好吧,客户的代码。
在堆搅动中偏爱缓存并不会开始得到回报,直到它进入毫秒范围。
与任何性能问题一样 - 首先编写干净的代码,测量和优化所需的内容。
如果您非常确定您的对象将永远不会被多个线程使用(从而同时调用相关函数),那么缓存分配的内存似乎很好。
如果您决定缓存依赖垃圾收集的未管理的内存块,则可能不足以足够早地释放内存。未管理的内存 (AllocHGlobal) 不计入 CLR 分配的内存,因此可能会延迟对象的垃圾收集)。您应该在您的对象上实现并正确使用 IDisposable。
您可以这样做,只要:
IDisposable
并且该Dispose()
方法应该释放内存。当然,类消费者将不得不调用Dispose()
或使用using(){}
块。)但是,P/Invoke 调用的实际编组更有可能成为瓶颈。您是否真正分析过代码,或者您是否在进行微优化?