我的程序大部分时间都花在数组模式匹配上,我在想我是否应该重写函数并放弃自动模式匹配。
例如一个非常简单的案例
let categorize array =
match array with
| [|(1|2);(1|2);(1|2)|] -> 3
| [|(1|2);(1|2);_|] -> 2
| [|(1|2);_;_|] -> 1
| _ -> 0
categorize [|2;1;3|]
在这种情况下,编译器是否会通过识别例如除了第三个元素外,第一种情况与第二种情况相同。
实际上模式更复杂,预优化的模式匹配可能比完全优化的模式匹配花费更多的时间。
最佳答案
直接来自 Reflector:
public static int categorize(int[] array)
{
if ((array > null) && (array.Length == 3))
{
switch (array[0])
{
case 1:
switch (array[1])
{
case 1:
switch (array[2])
{
case 1:
case 2:
goto Label_005C;
}
goto Label_005A;
case 2:
switch (array[2])
{
case 1:
case 2:
goto Label_005C;
}
goto Label_005A;
}
goto Label_0042;
case 2:
switch (array[1])
{
case 1:
switch (array[2])
{
case 1:
case 2:
goto Label_005C;
}
goto Label_005A;
case 2:
switch (array[2])
{
case 1:
case 2:
goto Label_005C;
}
goto Label_005A;
}
goto Label_0042;
}
}
return 0;
Label_0042:
return 1;
Label_005A:
return 2;
Label_005C:
return 3;
}
我没有看到任何低效的东西。
关于f# - 模式匹配有多聪明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13871524/