这是C#编译器完成的优化吗?

我通过lambda表达式创建了一批匿名函数。我想使用TaskId来区分匿名函数。这是代码:

int count = 3;
int i;
for (int j = 0; j < 10; j++)
{
    i = 0;
    Func<bool, Task<int>> func = async (b) =>
    {
        return j;
    };
    while (i++ < count)
    {
        var task = func(true);
        Console.WriteLine(String.Format("Task Result:{0} TaskId:{1}",
            task.Result, task.Id));
    }
}

这是输出

Task Result:0 TaskId:1
Task Result:0 TaskId:1
Task Result:0 TaskId:1
Task Result:1 TaskId:2
Task Result:1 TaskId:2
Task Result:1 TaskId:2
Task Result:2 TaskId:3
Task Result:2 TaskId:3
Task Result:2 TaskId:3
Task Result:3 TaskId:4
Task Result:3 TaskId:4
Task Result:3 TaskId:4
Task Result:4 TaskId:5
Task Result:4 TaskId:5
Task Result:4 TaskId:5
Task Result:5 TaskId:6
Task Result:5 TaskId:6
Task Result:5 TaskId:6
Task Result:6 TaskId:7
Task Result:6 TaskId:7
Task Result:6 TaskId:7
Task Result:7 TaskId:8
Task Result:7 TaskId:8
Task Result:7 TaskId:8
Task Result:8 TaskId:9
Task Result:8 TaskId:9
Task Result:8 TaskId:9
Task Result:9 TaskId:10
Task Result:9 TaskId:11
Task Result:9 TaskId:12

如您所见,由于结果大于8,因此TaskId发生了变化。我想知道这种现象的原因。谢谢你的帮助:)

迈克·兹伯雷

缓存本身不是由编译器本身,而是.NET框架。查看AsyncMethodBuilder编译器用来为异步方法管理生成的状态机的代码看起来SetResult有些缓存GetTaskForResult有一些非常具体的代码用于缓存基本值类型,包括:

// For Int32, we cache a range of common values, e.g. [-1,4).
else if (typeof(TResult) == typeof(Int32))
{
    // Compare to constants to avoid static field access if outside of cached range.
    // We compare to the upper bound first, as we're more likely to cache miss on the upper side than on the 
    // lower side, due to positive values being more common than negative as return values.
    Int32 value = (Int32)(object)result;
    if (value < AsyncTaskCache.EXCLUSIVE_INT32_MAX &&
        value >= AsyncTaskCache.INCLUSIVE_INT32_MIN)
    {
        Task<Int32> task = AsyncTaskCache.Int32Tasks[value - AsyncTaskCache.INCLUSIVE_INT32_MIN];
        return JitHelpers.UnsafeCast<Task<TResult>>(task); // UnsafeCast avoids a type check we know will succeed
    }
}

我们看到:

/// <summary>The minimum value, inclusive, for which we want a cached task.</summary>
internal const Int32 INCLUSIVE_INT32_MIN = -1;
/// <summary>The maximum value, exclusive, for which we want a cached task.</summary>
internal const Int32 EXCLUSIVE_INT32_MAX = 9;

这就是为什么8是魔术截止点。值得注意的是-1也应该被缓存,从我的测试来看也是如此。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#编译器会优化此代码吗?

来自分类Dev

C#编译器不会优化foreach吗?

来自分类Dev

C#编译器优化

来自分类Dev

这是MSVC ++编译器错误吗?

来自分类Dev

C#编译器会优化循环内对同一方法的调用吗?

来自分类Dev

了解MSVS C ++编译器优化

来自分类Dev

C 编译器优化的基准

来自分类Dev

指针的大小始终等于C编译器中int的大小。这是正确的吗?

来自分类Dev

VC ++ SSE代码生成-这是编译器错误吗?

来自分类Dev

这是ARM编译器代码生成错误吗?

来自分类Dev

这是Visual Studio 2010编译器中的错误吗?

来自分类Dev

这是ARM编译器代码生成错误吗?

来自分类Dev

C#垃圾收集器,线程和编译器/抖动优化

来自分类Dev

C ++编译器通常会优化静态(全局)引用吗?

来自分类Dev

GNU C++编译器g++的优化级别表,准确吗?

来自分类Dev

我可以得到编译器应用的优化日志吗?

来自分类Dev

编译器会优化未使用的链接文件吗?

来自分类Dev

编译器会优化集合初始化吗?

来自分类Dev

编译器可以优化字符串上的ToString()吗?

来自分类Dev

编译器会优化除法乘法吗

来自分类Dev

编译器可以优化dynamic_cast吗?

来自分类Dev

编译器可以优化汇编中的函数序言吗?

来自分类Dev

模板布尔会被编译器优化吗?

来自分类Dev

编译器可以优化此代码段吗?

来自分类Dev

编译器可以优化字符串上的ToString()吗?

来自分类Dev

编译器可以优化多个相同的函数调用吗

来自分类Dev

编译器可以优化可变长度的循环吗?

来自分类Dev

编译器可以优化离开方法的调用吗?

来自分类Dev

C#编译器优化-仅捕获包含throw的Catch

Related 相关文章

热门标签

归档