Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多少GCHandle固定的内存/对象会使垃圾收集器变慢?_C#_Garbage Collection_Unmanaged - Fatal编程技术网

C# 多少GCHandle固定的内存/对象会使垃圾收集器变慢?

C# 多少GCHandle固定的内存/对象会使垃圾收集器变慢?,c#,garbage-collection,unmanaged,C#,Garbage Collection,Unmanaged,我相信这个答案将取决于用户机器,但在固定数据方面必须有一些最佳实践 我需要保存5个字节数组,每个数组包含1.048.576个字节。通常我更喜欢使用GCHandle(托管)内存,但有些人说这会减慢GC的速度。我知道这可能会发生,但是需要固定多少内存/对象才能真正影响GC? 以下是我的选择: GCHandle.Alloc GCHandleType.pinted(托管)。它会减慢GC Marshal.AllocHGlobal(非托管访问)。不安全代码 使用位图在Scan0(非托管访问)中保存数据。不安

我相信这个答案将取决于用户机器,但在固定数据方面必须有一些最佳实践

我需要保存5个字节数组,每个数组包含1.048.576个字节。通常我更喜欢使用
GCHandle
(托管)内存,但有些人说这会减慢GC的速度。我知道这可能会发生,但是需要固定多少内存/对象才能真正影响GC?

以下是我的选择:

  • GCHandle.Alloc GCHandleType.pinted
    (托管)。它会减慢GC
  • Marshal.AllocHGlobal
    (非托管访问)。不安全代码
  • 使用
    位图
    在Scan0(非托管访问)中保存数据。不安全代码

  • 这是一个无法回答的问题。固定对象不会使GC慢那么多,当GC压缩堆时,它只是一块石头。只需跳过堆的固定部分,就可以轻松绕过岩石

    更糟糕的结果是,它将对收集完成后运行的代码产生持久的影响。由于堆没有被很好地压缩,引用的局部性就没有那么好,因此处理器无法从CPU缓存中获得同样多的内存。量化这种减速是不可能的,这在很大程度上取决于之后运行的代码类型。只是情况更糟,持续一段时间,直到下一次GC

    唯一好的建议是,如果你必须别针,那么尽可能短的时间。并避免在锁定对象时发生集合的情况。粗略地说,这意味着在保持pin的同时避免分配内存。如果程序运行多个线程,则不一定实用,这使得.config文件中的
    元素很有吸引力。它选择了一种不同的GC策略,使用了更多的内存,但为线程提供了自己的GC堆段。没有简单的指导来确定何时执行此操作,需要使用真实的数据集进行分析


    Marshal.AllocHGlobal和Bitmap对GC堆都没有显著影响,它们是从非托管内存堆分配的。

    固定五个分配,每个分配一兆字节,不会对GC产生任何影响。或者其他任何事情。为什么不试试呢?我强烈怀疑它会很好地工作。我也很怀疑使用你列出的任何一种选择会明显更快或更慢。谢谢,你知道关于这个主题的任何文章吗?我不做链接,谷歌比我做得好得多。任何一本关于.NET的像样的书都会谈到垃圾收集器。从来没有人对里希特通过C#的CLR感到失望。