模式匹配有多聪明?

col*_*ang 3 f# pattern-matching

我的程序大部分时间花在数组模式匹配上,我想知道我是否应该重写该函数并丢弃自动模式匹配.

例如一个非常简单的案例

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|]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器是否应用最少量的比较,通过识别例如第一种情况与第二种情况相同,除了第三种情况.

实际上模式更复杂,预优化模式匹配可能比完全优化模式匹配花费更多时间.

Dan*_*iel 6

直接从反射器:

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;
}
Run Code Online (Sandbox Code Playgroud)

我没有看到任何效率低下的东西.