gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:27:10 24 4
gpt4 key购买 nike

我通过 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 的代码编译器使用它来管理为异步方法生成的状态机。看起来 SetResultGetTaskForResult 中做了一些缓存。有一些非常具体的代码用于缓存基本值类型,包括:

// 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 也应该被缓存,从我的测试来看它是。

关于c# - 这是 C# 编译器完成的优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26458385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com