Tag: jit

内存中.NET值类型的布局

我有以下.NET值类型: [StructLayout(LayoutKind.Sequential)] public struct Date { public UInt16 V; } [StructLayout(LayoutKind.Sequential)] public struct StringPair { public String A; public String B; public String C; public Date D; public double V; } 我有代码将指向值类型的指针传递给非托管代码,以及通过调用System.Runtime.InteropServices.Marshal.OffsetOf发现的偏移量。 非托管代码填充Date和double值。 为StringPair结构报告的偏移正是我所期望的:0,8,16,24,32 我在测试函数中有以下代码: FieldInfo[] fields = typeof(StringPair).GetFields(BindingFlags.Instance|BindingFlags.Public); for ( int i = 0; i > field {0} @ offset {1}”, fields[i].Name, offset)); } […]

C#编译器和JIT都做了哪些优化?

我正在继续我的编译器类的C#编译工作。 目前我已经完成了教科书中关于编译器优化的章节。 在大多数情况下,我的教科书在编写时没有及时编译,我很好奇C#编译器执行的静态,pre-jit优化的种类与JIT过程中的执行情况。 ? 当我与人们谈论编译CLR时,我通常会听到“大多数优化都是由JIT完成的”。 是循环展开,常量折叠/传播,C#编译器在Jit之前完成指令交织还是由抖动处理? 如果它们不是由抖动处理的,那么抖动会做什么样的优化,这对于即时编译器来说是唯一的?

为什么.net使用JIT编译器而不是仅在目标机器上编译一次代码?

标题几乎总结了一下,但我想知道为什么像.net这样的系统每次运行时都会编译代码,而不是只在目标机器上编译一次?

在什么级别C#编译器或JIT优化应用程序代码?

我想知道这些信息以减少我的代码大小,所以我不会浪费时间来优化将由编译器或JIT完成的事情。 例如: 如果我们假设编译器内联调用属性的get函数,那么我不必将返回值保存在局部变量中以避免函数调用。 我想推荐一个描述正在发生的事情的好参考?

如何通过JIT编译器编译generics?

我知道generics是由JIT编译的(就像其他所有东西一样),与编译代码时生成的模板形成对比。 问题是可以使用reflection在运行时创建新的generics类型。 这当然会影响通用的约束。 哪个已经通过了语义解析器。 有人能解释一下这是如何处理的吗? 究竟发生了什么? (代码生成和语义检查)

有没有办法查看由JITter为给定的C#/ CIL生成的本机代码?

在对这个答案的评论中(建议在整数乘法/除法中使用位移运算符,为了提高性能),我询问这实际上是否会更快。 在我的脑海中有一个想法,在某种程度上 ,某些东西将足够聪明,以确定>> 1和/ 2是相同的操作。 但是,我现在想知道这是否真的是真的,如果是,它会发生在什么级别。 测试程序为两种方法产生以下比较CIL( optimize开启),这两种方法分别对其参数进行划分和移位: IL_0000: ldarg.0 IL_0001: ldc.i4.2 IL_0002: div IL_0003: ret } // end of method Program::Divider 与 IL_0000: ldarg.0 IL_0001: ldc.i4.1 IL_0002: shr IL_0003: ret } // end of method Program::Shifter 所以C#编译器发出div或shr指令,而不是聪明。 我现在想看看JITter生成的实际x86汇编程序,但我不知道如何执行此操作。 它甚至可能吗? 编辑添加 发现 感谢您的回答,已接受来自nobugz的那个,因为它包含有关该调试器选项的关键信息。 最终对我有用的是: 切换到发布配置 在Tools | Options | Debugger Tools | Options | Debugger […]

检索JIT输出

我有兴趣通过C#程序查看实际的x86程序集输出(而不是CLR字节码指令)。 有没有一个很好的方法来做到这一点?