C#中的内存布局优化

9
免责声明:以下措辞可能存在误解,请在我将代码写入到它看起来像零和一的那个时刻,如果我理解有误,请纠正我。
以下是问题(这些问题已经链接):
在C#中,如果我使用优化技术或不使用优化技术,我的数据结构和/或数据操作实现是否会产生性能影响?
编译器在输出IL时做了什么?它可靠吗?也就是说,如果我使我的数据SOA,在IL中它是否总是SOA?
当JIT读取IL时,我的数据结构会发生什么变化?它会被更改吗?是否会自动优化以适应我的处理器?
参考:关于C/C++的讨论 我知道这次谈话针对本地代码,并讨论处理器布局与本地代码中数据布局的具体细节。
我也知道C#编译器和JIT编译器将为我优化这些问题。
基本上,我想知道这种优化是否会对我的性能产生影响:
  • 使用SOA代替AOS
  • 向量访问模式(在内存中连续访问)
  • 等等...您可以自己命名...

我从事游戏开发,性能至关重要,我们处理大量数据,并且我们需要每秒最少进行24次操作,当我试图检测3000个不同对象之间的碰撞时,我不能让GC执行300毫秒的操作或者随意分散内存的访问/分配。

有关我阅读但实际上没有回答问题的参考信息:

但它们并未回答与处理器和数据布局实现相关的性能成本问题。


在汉斯回答后进一步说明:

当你说:“你可以追求SOA,但这没有帮助。是的,由于所有这些结构复制,你的程序会变慢,并且以确定性方式变慢。但它并不能阻止雨水。你既拥有缓慢的程序,又有完全相同的暂停。”

这并不意味着我的程序从SOA中毫无益处,它将更快(潜在地),因为它将有助于处理我的数据。只是它对GC本身没有影响。

另一件事是,如果我不进行SOA或其他改进数据布局的操作,编译器不会为我改进,对吧?我不能依赖编译器来处理那种事情吗?


1
如果你在谈论这个层面的东西,C#(或任何托管内存环境)可能不适合你。但是,如果你从事实时计算、金融计算、大数据等方面的工作呢? - Aron
1
实时性很重要,但是我希望能够正确地使用C#来达到那种控制水平。 - Géry Arduino
1
布局并没有根本性的改变。 - harold
1
按照定义,实时性和垃圾回收器是互斥的。 - Aron
@Aron 重点是实时和垃圾回收绝对不是互斥的,如果使用特殊的GC,甚至可以进行硬实时。据我所知,一些美国战斗机的软件是用Java编写的。 - Voo
显示剩余3条评论
1个回答

5
担心垃圾回收就像担心今天是否会下雨。早晚会下雨,你无法阻止它。而且它是必需的,如果没有它,草坪看起来就不会那么翠绿。你绝不能故意阻止它下雨。因为如果你这样做了,它将以洪水的形式降落,冲走美丽的草坪。你需要的是持续的毛毛雨,最好在夜间进行,这样你就不用担心了。
.NET GC强烈支持这一点。只有小的gen #0和#1集合会暂停您的程序。昂贵的gen #2集合发生在后台,而您的代码继续执行。最坏情况下的暂停时间约为100微秒。这与现代操作系统上您的程序由于其他原因而暂停时的暂停时间几乎无法区分。就像您的游戏循环暂时被挂起,因为另一个优先级更高的内核线程需要运行一样。只是毛毛雨,对人眼不可见。
您可以追求SOA,但这并没有帮助。是的,由于所有结构都需要复制,所以您的程序会变慢,并且以确定性方式变慢。但它并不能阻止雨水。您会遭受最糟糕的情况,即慢速程序和完全相同的暂停。
不要担心雨水,只需确保它在正确的时间下降。为了利用后台GC,您需要结构化数据,使其要么非常短寿,因此可以轻松通过gen #0/1集合消失。或者生命非常长,因此在gen #2中找到一个舒适的家,并在那里停留一段时间。这通常是程序中非常常见的模式,特别是在游戏中。你很可能什么都不需要做。

1
你可以追求面向服务架构(SOA),但这并没有帮助——啥?我不明白为什么垃圾回收会影响程序的内存访问模式以及由此引起的缓存等后果。至少对于.NET 4.5(即使在SustainedLowLatency模式下),宣称不存在全局停顿垃圾回收是不正确的——它们只是比以前更少出现而已。 - Voo
不太清楚你的评论与问题有何关联,请发表自己的答案。 - Hans Passant
2
我认为评论的一个原因是质疑回答中发布的事实,并要求澄清或更正,而不仅仅是对回答进行负面评价。 - Voo
谢谢Hans提供的好答案,我更新了我的问题并请求一些澄清。 - Géry Arduino
SOA是否更高效尚无定论。通常情况下并不是,因为你有太多的A,但确定的方法是测量。你可以从Jitter(而不是编译器)获得帮助,它会在可能的情况下尽力使S高效。通常的.NET指导方针适用,当结构体成员不超过4个时,它们是高效的,因此它们适合于可用的处理器寄存器中。超出这个范围,复制开始拖慢代码。实际上,结构体最终仍然会在堆上作为“Manager”类的字段。在这种情况下,你根本没有优势。 - Hans Passant
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接