上下文:
我有一个C#的OpenGL桌面应用程序。我们有各种各样的缓冲区,每帧都会更新,因此每帧都需要传输到GPU。
目前,我们在应用程序的生命周期内为每个缓冲区保留一个引脚,但我想知道每次传输(每个缓冲区的每个帧)只使用一个引脚是否会显着较慢,比如使用固定块。
这对我们的代码有好处,因为我们不需要在每个缓冲区存储多个对象/值,也不需要担心显式清理(释放固定的句柄)。
我们有效地为每个实体类型提供了一个缓冲。所以说,总共最多有几十个缓冲区,尽管这些缓冲区可能相当大,每个缓冲区有几个GB。
问题:
固定内存的性能考虑/成本是什么(特别是大型数组,其中一些最终会出现在洛上)?使用固定块和使用GHHandle Alloc / AddrOfPinnedObject / Free之间是否存在性能差异?
1条答案
按热度按时间xfyts7mz1#
从this article开始,.net对象标头包含:
一个特殊的标志,它通知GC一个对象被固定,在垃圾收集期间不应该被移动。
所以我希望固定只是简单地设置或取消设置这个标志,这应该只有几条指令。如果使用并发GC,则可能涉及获取锁,如果必须等待锁,则可能会产生一些影响。但我不知道GC的内部细节。
不固定内存的典型原因是它会阻止内存的压缩,因此可能导致内存碎片。但是如果缓冲区大于85 kb,它们将位于大对象堆(洛)中,并且无论如何都不会自动压缩。因此,我不希望任何真实的影响,由于碎片。
但就像任何关于性能的事情一样,衡量。我可以猜测性能,但我很可能是错的。因此,我建议在更改之前和之后对应用程序进行基准测试。如果您想在花费大量时间重构应用程序之前测试这个想法,您也可以考虑编写一个微基准测试。