我想看看以下 2 个简单的递归函数是否能像 C# 版本一样执行,所以我使用 ILSPY 将它们反编译成 C#。
let rec findPivot i =
if i = 0 then -1
else
if myArray.[i] > myArray.[i-1] then i - 1
else findPivot (i - 1)
let rec findTarget value i =
if (myArray.[i] > value) then i
else findTarget value (i - 1)
得到:
internal static int findPivot@11(int[] myArray, int i)
{
while (i != 0)
{
if (myArray[i] > myArray[i - 1])
{
return i - 1;
}
int[] arg_22_0 = myArray; // useless
i--;
myArray = arg_22_0; // useless
}
return -1;
}
internal static int findTarget@17(int[] myArray, int value, int i)
{
while (myArray[i] <= value)
{
int[] arg_16_0 = myArray; // useless
int arg_14_0 = value; // useless
i--;
value = arg_14_0; // useless
myArray = arg_16_0; // useless
}
return i;
}
我很惊讶 F# 编译会生成如此混乱的代码。尽管它可能不会影响性能(JIT 可能会进一步优化)。当代码在系统中更加复杂和关键时,我仍然有点担心性能。
关于编译器为何发出此类代码的任何评论?