我确信这个答案取决于用户机器,但一定有一些固定数据的最佳实践.
我需要保存 5 个字节数组,每个数组包含 1.048.576 字节。通常我更喜欢使用GCHandle
(托管)内存,但有些人说这会减慢 GC 的速度。我知道这可能会发生,但是需要固定多少内存/对象才能开始真正影响 GC?
以下是我有的选择:
-
GCHandle.Alloc GCHandleType.Pinned
(管理)。它会减慢GC吗?
-
Marshal.AllocHGlobal
(非托管访问)。不安全代码
- use a
Bitmap
将数据保存在 Scan0(非托管访问)中。不安全代码
这是一个无可救药、无法回答的问题。固定对象不会减慢 GC 太多,它只是 GC 压缩堆时的一块石头。只需跳过堆的固定部分即可轻松解决该问题。
更糟糕的结果是它将对运行的代码产生持久的影响after收集完成。由于堆压缩得不够好,引用的局部性也不好,因此处理器无法从 CPU 缓存中获得尽可能多的资源。量化这种减慢是不可能的,它很大程度上取决于随后运行的代码类型。只是情况更糟并且持续一段时间,直到下一次 GC。
唯一好的建议是,如果你have固定,然后尽可能短的时间进行固定。并避免可能发生集合的情况while对象被固定。粗略地说,这意味着您可以避免在按住 pin 的情况下分配内存。如果程序运行多个线程,则并不总是实用,使得<gcServer>
.config 文件中的元素很有吸引力。它选择了不同的 GC 策略,该策略使用更多内存,但为线程提供了自己的 GC 堆段。没有简单的指导来确定何时执行此操作,需要使用实际数据集进行分析。
Marshal.AllocHGlobal 和 Bitmap 都对 GC 堆没有任何显着影响,它们从非托管内存堆中分配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)