繁体   English   中英

C#类型的安全性如何影响垃圾回收?

[英]How does c# type safety affect the garbage collection?

我正在处理可处理较大缓冲区(> 100MB)的代码,并且对这些缓冲区的操作是在unsafe块中完成的。 我想重构它们以避免unsafe代码。 在开始之前,我想知道可能的内存性能提升(正/负/中性)。

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

这取决于您的缓冲区(用于)。

如此大的缓冲区将放置在大对象堆(LOH)上,因此请务必仔细阅读有关后果。

充其量,我期望性能相同。

unsafe块是一种语言功能,而不是CLR功能。 因此它们在运行时实际上并不存在。 在运行时确实存在固定变量,如果可以避免使用固定变量,则可能会获得性能提升,但这取决于成本/收益之间的权衡。 因此,除非代码没有充分的理由将一个100 MB的缓冲区固定到内存中,否则不必担心性能会受到影响。

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

  1. 用常规的数组索引替换对数组的指针访问(我想您正在使用那些指针?)会引入数组长度检查->降低​​性能 同样,在大多数情况下,指针算术运算-即使其速度不如本地语言所知-也是访问数据(数组)的最快方法。

  2. 编译器仍然“知道”类型,即使在不安全的块中也是如此。 我看不出有任何机会制作“更好的”代码。 同样,即使“更好”的代码也会导致创建更少的对象,这也只会影响GC的性能。 我怀疑编译器是否可以避免创建新对象-只需知道它们的类型即可。 ->也没有改善

  3. 上面已经说明了有关固定的论点。 摆脱固定的对象可能会稍微提高性能-但仅适用于小型对象。 不适用于驻留在(非压缩)大对象堆上的大对象,因为它们无论如何都不会移动。 ->中性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM