免责声明:下面的措辞中可能存在一些误解,请纠正我,如果我误解了我的代码是在C#处理的那一刻我写的那一刻它看起来像零和一个
问题如下(这些是相关的):
在C#中我的数据结构和/或我的数据操作实现是否有任何方式,无论我是否使用优化技术都会对性能产生影响?
输出IL时编译器做了什么,它可靠吗?含义:如果我创建数据SOA将是IL中的SOA吗?总是?
当JIT读取IL时,我的数据结构会发生什么?它改变了吗?它是否自动优化以适合我的处理器?
cf:谈论C/C++
我知道这个演讲的目标是本机代码,并讨论处理器布局的细节与本机代码中的数据布局.
我也知道C#编译器和JIT编译器会针对这些问题优化我的东西.
基本上我想知道这些优化是否会对我的性能产生影响:
我从事游戏开发工作并且性能至关重要,我们操作大量数据并且我们需要每秒至少执行24次,我不能让GC执行300毫秒的操作或者当我在任何地方访问/分配内存时试图检测3000个不同物体之间的碰撞
关于我读过的东西的参考,但没有真正回答这个问题:
优秀的Eric Lippert关于C#中的结构和值类型的文章(如果您认为值类型总是在C#中的堆栈中,请阅读它,您将其用于处理)
关于在C#中优化内存的最佳实践的问题(更重要的是它的答案)
但是那些没有回答相对于处理器和数据布局实现的性能成本.
在汉斯回答之后要走得更远:
当你说:"你可以追求SOA,但这没有帮助.是的,你的程序会因为所有结构复制而减速,并且以确定的方式这样做.但它并没有阻止下雨.你得到了最糟糕的两个,一个缓慢的程序和完全相同的停顿."
这并不意味着我的程序不会从SOA中获益,它会更快(可能),因为它将有助于处理我的数据.只是它本身对GC没有影响.
另一件事是,如果我不在我的数据布局中进行SOA或其他改进,编译器对我来说不会改进吗?我不能依靠编译器来处理那种事情?