例如:我将数字1到7映射到一周中的几天.我可以用七项案例陈述来查找它们,或者使用七项常数数组.哪个更快?
案例:
function GetDayNameBr(Num: Integer): String; begin case Num of 1: Result := 'Domingo'; 2: Result := 'Segunda'; 3: Result := 'Terça'; 4: Result := 'Quarta'; 5: Result := 'Quinta'; 6: Result := 'Sexta'; 7: Result := 'Sábado'; end; end;
常数数组示例:
function GetDayNameBr(Num: Integer): String; const DayNames: array [1..7] of String = ( 'Domingo','Segunda','Terça','Quarta','Quinta','Sexta','Sábado'); begin Result := DayNames[Num]; end;
解决方法
两者几乎同样快,至少在x86下,即使用32位Delphi编译器.
数组将生成索引查找,而当定位到32位时,情况将基于查找表生成跳转指令.数组将会稍微快点一点,但只是略微.
但是,AFAIR我发现,当指定64位时,case指令不会在x64下生成这样的查找表.它生成比较和条件跳转的列表(如果值= 1,那么…如果value = 2 then …),这显然更慢.
在你的情况下,我将使用数组查找和枚举,而不是纯整数值.它将编译为整数,但会更容易调试和发展.如果枚举更改,常量数组将不再编译,所以您将能够在编译时避免某些问题,而不是在运行时.我试图穷尽地使用这样的小列表的枚举,而不是整数.这是Delphi / pascal中的一个,我非常想念C#或Java.
type TDay = (dDomingo,dSegunda,dTerca,dQuarta,dSexta,dSabado); function GetDayNameBr(Num: TDay): String; const DayNames: array [TDay] of String = ( 'Domingo','Sábado'); begin Result := DayNames[Num]; end;
或者甚至更好的IMHO,直接在代码中的DayNames [Num],这将是所有平台上最安全和最快的.