c#type安全性如何影响垃圾收集?

c#type安全性如何影响垃圾收集?,c#,.net,garbage-collection,type-safety,C#,.net,Garbage Collection,Type Safety,我正在处理处理大缓冲区(>100MB)的代码,这些缓冲区的操作是在unsafe块中完成的。我想重构这些代码以避免不安全的代码。在开始之前,我想知道可能的内存性能增益(正/负/中性) 我断言,如果编译器能够验证类型,它可能会生成更好的代码,这也意味着良好的GC性能。这是一个有效的断言吗?你有什么经验?谢谢。这取决于缓冲区的用途 这样大的缓冲区将被放置在大对象堆(LOH)上,因此请务必仔细阅读,以了解其后果 充其量,我也会期待同样的表现 这取决于缓冲区的用途 这样大的缓冲区将被放置在大对象堆(LOH

我正在处理处理大缓冲区(>100MB)的代码,这些缓冲区的操作是在
unsafe
块中完成的。我想重构这些代码以避免不安全的代码。在开始之前,我想知道可能的内存性能增益(正/负/中性)


我断言,如果编译器能够验证类型,它可能会生成更好的代码,这也意味着良好的GC性能。这是一个有效的断言吗?你有什么经验?谢谢。

这取决于缓冲区的用途

这样大的缓冲区将被放置在大对象堆(LOH)上,因此请务必仔细阅读,以了解其后果


充其量,我也会期待同样的表现

这取决于缓冲区的用途

这样大的缓冲区将被放置在大对象堆(LOH)上,因此请务必仔细阅读,以了解其后果


充其量,我也会期待同样的表现

不安全
块是一种语言功能,而不是CLR功能。所以它们在运行时并不存在。运行时存在的是固定变量,如果可以避免这些变量,可能会获得性能增益,但这取决于成本/收益之间的权衡。因此,除非代码无正当理由将100 MB缓冲区固定到内存中,否则不要担心性能影响。

不安全
块是一种语言功能,而不是CLR功能。所以它们在运行时并不存在。运行时存在的是固定变量,如果可以避免这些变量,可能会获得性能增益,但这取决于成本/收益之间的权衡。因此,不要担心性能影响,除非代码无正当理由地将100 MB缓冲区固定到内存中。

我预计会产生负面影响。除了“安全”标志消失之外,我看不到删除不安全代码的任何好处:

  • 替换对的指针访问 数组(我想您正在使用 具有规则数组索引的?)将引入一个数组 长度检查->性能较低。此外,在大多数情况下,指针arrithmetic(即使它没有本地语言中的速度快)将是访问数据(数组)的最快方法

  • 编译器确实“知道”类型 无论如何,即使在不安全的街区。我 看不出有任何机会 制作“更好”的代码。还有,甚至 “更好”的代码只会影响 GC性能,如果它会导致 以减少正在创建的对象。我 毫无疑问,编译器可以避免 创建新对象-仅通过 知道他们的类型<强>->否 改进或

  • 关于钉住的争论已经结束 上面已经说过了。得到 消除固定对象可能会有所改善 演出有点紧张,但只有一点紧张 对于小对象。不多 位于(非)上的对象 压缩)大型对象堆,因为 他们无论如何都不会被移动->中性


  • 我期待负面的影响。除了“安全”标志消失之外,我看不到删除不安全代码的任何好处:

  • 替换对的指针访问 数组(我想您正在使用 具有规则数组索引的?)将引入一个数组 长度检查->性能较低。此外,在大多数情况下,指针arrithmetic(即使它没有本地语言中的速度快)将是访问数据(数组)的最快方法

  • 编译器确实“知道”类型 无论如何,即使在不安全的街区。我 看不出有任何机会 制作“更好”的代码。还有,甚至 “更好”的代码只会影响 GC性能,如果它会导致 以减少正在创建的对象。我 毫无疑问,编译器可以避免 创建新对象-仅通过 知道他们的类型<强>->否 改进或

  • 关于钉住的争论已经结束 上面已经说过了。得到 消除固定对象可能会有所改善 演出有点紧张,但只有一点紧张 对于小对象。不多 位于(非)上的对象 压缩)大型对象堆,因为 他们无论如何都不会被移动->中性


  • 比类型安全性更相关的是
    unsafe
    块中的钉住活动。是的,在各种操作之前,缓冲区被钉住在“固定”块中,我相信这是放开类型安全性以便使用指针进行操作的结果。钉住没有任何区别。这些大型阵列是在LOH中分配的,它们是不可移动的。@Hans Passant:这是一个很好的观点;我被纠正了。比类型安全性更相关的是
    不安全的
    块中的钉住活动。是的,在各种操作之前,缓冲区被钉住在“固定”块中,我相信这是放开类型安全性以便使用指针进行操作的结果。钉住没有任何区别。这些大型阵列是在LOH中分配的,它们是不可移动的。@Hans Passant:这是一个很好的观点;我被纠正了。