我继续在我的编译器类的C#编译器上工作.目前我已经完成了教科书中关于编译器优化的章节.
在大多数情况下,我的教科书在编写时没有考虑到及时编译,我对C#编译器执行的静态,预jit优化的种类与JIT过程中的执行情况感到好奇?
当我与人们谈论有关CLR的编译时,我通常会听到类似的事情,"大多数优化都是由JIT完成的".
是循环展开,常量折叠/传播,C#编译器在Jit之前完成指令交织还是由抖动处理?如果它们不是由抖动处理的,那么抖动对于即时编译器所做的那种优化是什么?
sealed class A
{
public int X;
public int Y { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个新的A实例,它需要大约550ms才能访问Y 100,000,000次,而访问X大约需要250ms.我将它作为发布版本运行,它对于该属性来说仍然要慢得多.为什么.NET不优化Y到字段?
编辑:
A t = new A();
t.Y = 50;
t.X = 50;
Int64 y = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100000000; i++)
y += t.Y;
sw.Stop();
Run Code Online (Sandbox Code Playgroud)
那是我用来测试的代码,我正在改变tY到tX来测试X. 我也在发布版本中.
我一直在关注如何在C#+ XNA中编写基本的tile map编辑器的教程,我对使用的编码实践有疑问.主Game类包含许多公共静态变量,然后从其他实例化类中访问和修改,而不使用getter或setter.这是不好的编码练习吗?链接到教程:http://www.youtube.com/watch?v = Tbs5EA- 9Zfg