你如何在C#中做"内联函数"?我认为我不理解这个概念.他们喜欢匿名方法吗?像lambda函数?
注意:答案几乎完全处理内联函数的能力,即"用被调用者的主体替换函数调用站点的手动或编译器优化".如果您对匿名(也称为lambda)函数感兴趣,请参阅@ jalf的答案或者每个人都在说什么'Lambda'?.
根据我的理解,CLR编译器对实例方法和静态方法都采用相同的方法,只要第一次调用该方法,IL代码就是JITted.今天我和我的同事进行了讨论,他告诉我静态方法的处理方式与实例方法不同.即,只要程序集加载到应用程序域中,静态方法就会被JIT,而实例方法在第一次被调用时就会被JIT.
我真的很困惑,并没有看到为什么静态方法应该由CLR急切编译的原因?我理解关键终结器对象的静态构造函数或终结器方法,或者使用约束执行区域时.但是如果某个类有静态方法和实例方法的组合,我真的不确定为什么一旦包含该类的程序集被加载到内存中,所有静态方法都会被JIT实现?
请帮助我理解这种行为.
我有以下插入排序算法实现:
private static void InsertionSort(List<int> array)
{
for (int i = 1; i < array.Count; ++i)
{
for (int j = i; j > 0 && array[j - 1] > array[j]; --j)
{
//swap(array, j, j-1);
int temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
}
}
}
private static void swap(List<int> array, int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
Run Code Online (Sandbox Code Playgroud)
当我运行我的算法时,swap(array, j, j-1);它需要花费更多的时间(50000个元素+2秒),而不是我的函数体内联.
为什么?
我想知道CLR适用于JIT编译的范围和顺序.
例如,如果我的应用程序只调用给定类的单个方法,那么该类的未使用方法是否会不必要地编译JIT?如果是的话,在执行我需要的一个方法之前,它们都是JIT编译的,还是它们在事后被懒惰地编译了?
那个方法中的分支怎么样?CLR是否允许编译方法中的一半代码,同时允许同一方法中的单独分支在需要之前保持未编译状态?
似乎随着时间的推移,我发现的文章提供了一些细节的一瞥,但是现在我找不到任何能给出CLR选择JIT代码段的方式和时间的统一,可读的摘要.任何建议的书籍或链接?
如果任何这样的指南会打破.net版本的JIT决策逻辑,那将是最好的.