我的情况是我使用AllocHGlobal(总是大小相同)对我经常使用的函数(可能每秒30次),在我称之为FreeHGlobal的函数的末尾
如果我保留用AllocHGlobal分配的内存部分并在Dispose类中释放它或者每次调用函数时应该分配/释放它会更好吗?
我不知道这种记忆在c#中是如何表现的,对我来说这是一个“新世界”
答案 0 :(得分:2)
支持缓存堆缓存并不会开始有效,直到达到毫秒范围。
答案 1 :(得分:1)
与任何性能问题一样 - 首先编写干净的代码,测量并优化所需的内容。
如果您非常确定您的对象永远不会被多个线程使用(从而同时调用相关函数),那么缓存已分配的内存似乎没问题。
如果你决定缓存依赖于垃圾收集的无人值守内存块,那么就不足以尽早释放内存。未管理的内存(AllocHGlobal)不计入CLR分配的内存,因此可能会延迟对象的垃圾收集)。您应该在对象上实现并正确使用IDisposable。
答案 2 :(得分:0)
你可以这样做:
IDisposable
并且Dispose()
方法应该释放内存。当然,类消费者将拥有致电Dispose()
或使用using(){}
阻止。)但是,P / Invoke呼叫的实际封送更有可能成为瓶颈。您是否真的对代码进行了分析,还是进行了微观优化?