相关疑难解决方法(0)

C#中的内联函数?

你如何在C#中做"内联函数"?我认为我不理解这个概念.他们喜欢匿名方法吗?像lambda函数?

注意:答案几乎完全处理内联函数的能力,即"用被调用者的主体替换函数调用站点的手动或编译器优化".如果您对匿名(也称为lambda)函数感兴趣,请参阅@ jalf的答案或者每个人都在说什么'Lambda'?.

c# optimization inline

264
推荐指数
7
解决办法
17万
查看次数

是否急切地编译静态方法(JIT'ed)?

根据我的理解,CLR编译器对实例方法和静态方法都采用相同的方法,只要第一次调用该方法,IL代码就是JITted.今天我和我的同事进行了讨论,他告诉我静态方法的处理方式与实例方法不同.即,只要程序集加载到应用程序域中,静态方法就会被JIT,而实例方法在第一次被调用时就会被JIT.

我真的很困惑,并没有看到为什么静态方法应该由CLR急切编译的原因?我理解关键终结器对象的静态构造函数或终结器方法,或者使用约束执行区域时.但是如果某个类有静态方法和实例方法的组合,我真的不确定为什么一旦包含该类的程序集被加载到内存中,所有静态方法都会被JIT实现?

请帮助我理解这种行为.

.net clr jit memory-management

10
推荐指数
1
解决办法
507
查看次数

为什么函数调用需要这么多时间?

我有以下插入排序算法实现:

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秒),而不是我的函数体内联.

为什么?

c# algorithm performance

7
推荐指数
1
解决办法
1622
查看次数

记录CLR JIT策略

我想知道CLR适用于JIT编译的范围和顺序.

例如,如果我的应用程序只调用给定类的单个方法,那么该类的未使用方法是否会不必要地编译JIT?如果是的话,在执行我需要的一个方法之前,它们都是JIT编译的,还是它们在事后被懒惰地编译了?

那个方法中的分支怎么样?CLR是否允许编译方法中的一半代码,同时允许同一方法中的单独分支在需要之前保持未编译状态?

似乎随着时间的推移,我发现的文章提供了一些细节的一瞥,但是现在我找不到任何能给出CLR选择JIT代码段的方式和时间的统一,可读的摘要.任何建议的书籍或链接?

如果任何这样的指南会打破.net版本的JIT决策逻辑,那将是最好的.

.net clr jit

3
推荐指数
1
解决办法
265
查看次数

标签 统计

.net ×2

c# ×2

clr ×2

jit ×2

algorithm ×1

inline ×1

memory-management ×1

optimization ×1

performance ×1