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

前端之家收集整理的这篇文章主要介绍了数组 – 当查找映射到小整数的常量时,使用case语句或常量数组是否更快?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
例如:我将数字1到7映射到一周中的几天.我可以用七项案例陈述来查找它们,或者使用七项常数数组.哪个更快?

案例:

  1. function GetDayNameBr(Num: Integer): String;
  2. begin
  3. case Num of
  4. 1: Result := 'Domingo';
  5. 2: Result := 'Segunda';
  6. 3: Result := 'Terça';
  7. 4: Result := 'Quarta';
  8. 5: Result := 'Quinta';
  9. 6: Result := 'Sexta';
  10. 7: Result := 'Sábado';
  11. end;
  12. end;

常数数组示例:

  1. function GetDayNameBr(Num: Integer): String;
  2. const
  3. DayNames: array [1..7] of String = (
  4. 'Domingo','Segunda','Terça','Quarta','Quinta','Sexta','Sábado');
  5. begin
  6. Result := DayNames[Num];
  7. end;

解决方法

两者几乎同样快,至少在x86下,即使用32位Delphi编译器.

数组将生成索引查找,而当定位到32位时,情况将基于查找表生成跳转指令.数组将会稍微快点一点,但只是略微.

但是,AFAIR我发现,当指定64位时,case指令不会在x64下生成这样的查找表.它生成比较和条件跳转的列表(如果值= 1,那么…如果value = 2 then …),这显然更慢.

在你的情况下,我将使用数组查找和枚举,而不是纯整数值.它将编译为整数,但会更容易调试和发展.如果枚举更改,常量数组将不再编译,所以您将能够在编译时避免某些问题,而不是在运行时.我试图穷尽地使用这样的小列表的枚举,而不是整数.这是Delphi / pascal中的一个,我非常想念C#或Java.

  1. type
  2. TDay = (dDomingo,dSegunda,dTerca,dQuarta,dSexta,dSabado);
  3.  
  4. function GetDayNameBr(Num: TDay): String;
  5. const
  6. DayNames: array [TDay] of String = (
  7. 'Domingo','Sábado');
  8. begin
  9. Result := DayNames[Num];
  10. end;

或者甚至更好的IMHO,直接在代码中的DayNames [Num],这将是所有平台上最安全和最快的.

猜你在找的Delphi相关文章