例如:我将数字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],这将是所有平台上最安全和最快的.