数组 – 当查找映射到小整数的常量时,使用case语句或常量数组是否更快?

前端之家收集整理的这篇文章主要介绍了数组 – 当查找映射到小整数的常量时,使用case语句或常量数组是否更快?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
例如:我将数字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],这将是所有平台上最安全和最快的.

猜你在找的Delphi相关文章