免责声明:以下措辞可能存在误解,请在我将代码写入到它看起来像零和一的那个时刻,如果我理解有误,请纠正我。
以下是问题(这些问题已经链接):
在C#中,如果我使用优化技术或不使用优化技术,我的数据结构和/或数据操作实现是否会产生性能影响?
编译器在输出IL时做了什么?它可靠吗?也就是说,如果我使我的数据SOA,在IL中它是否总是SOA?
当JIT读取IL时,我的数据结构会发生什么变化?它会被更改吗?是否会自动优化以适应我的处理器?
参考:关于C/C++的讨论 我知道这次谈话针对本地代码,并讨论处理器布局与本地代码中数据布局的具体细节。
我也知道C#编译器和JIT编译器将为我优化这些问题。
基本上,我想知道这种优化是否会对我的性能产生影响:
以下是问题(这些问题已经链接):
在C#中,如果我使用优化技术或不使用优化技术,我的数据结构和/或数据操作实现是否会产生性能影响?
编译器在输出IL时做了什么?它可靠吗?也就是说,如果我使我的数据SOA,在IL中它是否总是SOA?
当JIT读取IL时,我的数据结构会发生什么变化?它会被更改吗?是否会自动优化以适应我的处理器?
参考:关于C/C++的讨论 我知道这次谈话针对本地代码,并讨论处理器布局与本地代码中数据布局的具体细节。
我也知道C#编译器和JIT编译器将为我优化这些问题。
基本上,我想知道这种优化是否会对我的性能产生影响:
- 使用SOA代替AOS
- 向量访问模式(在内存中连续访问)
- 等等...您可以自己命名...
我从事游戏开发,性能至关重要,我们处理大量数据,并且我们需要每秒最少进行24次操作,当我试图检测3000个不同对象之间的碰撞时,我不能让GC执行300毫秒的操作或者随意分散内存的访问/分配。
有关我阅读但实际上没有回答问题的参考信息:
优秀的Eric Lippert关于C#中结构体和值类型的文章(如果您认为值类型在C#中始终在堆栈上,那么阅读此文将会给您带来惊喜)
C#中优化内存的最佳实践的SO问题(更重要的是它的答案)
但它们并未回答与处理器和数据布局实现相关的性能成本问题。
在汉斯回答后进一步说明:
当你说:“你可以追求SOA,但这没有帮助。是的,由于所有这些结构复制,你的程序会变慢,并且以确定性方式变慢。但它并不能阻止雨水。你既拥有缓慢的程序,又有完全相同的暂停。”
这并不意味着我的程序从SOA中毫无益处,它将更快(潜在地),因为它将有助于处理我的数据。只是它对GC本身没有影响。
另一件事是,如果我不进行SOA或其他改进数据布局的操作,编译器不会为我改进,对吧?我不能依赖编译器来处理那种事情吗?