gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:40:46 25 4
gpt4 key购买 nike

例如:我将数字 1 到 7 映射到一周中的几天。我可以使用七项 case 语句查找它们,或者使用七项常量数组。哪个更快?

案例:

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;

最佳答案

这两个函数性能特征不同的主要原因是它们执行不同的操作。你不是在比较同类。当输入值在 1 到 7 范围内时,行为是相同的。但是,当输入值超出该范围时,行为就会出现偏差。

第一个版本,使用case,必须首先检查该值是否在1到7范围内。只有这样才允许实际分配给Result 。如果值在 1 到 7 范围内,则编译器会将 case 语句转换为无条件 jmp 语句,如下所示:

jmp dword ptr [eax*4+$40428f]

这里eax是日期索引。这些跳转的目标是将字符串文字简单地分配给 Result 变量的指令。

第二个版本使用数组,不检查输入值是否在范围内。即使输入值超出范围,它也会直接索引到数组中,当然这种数组索引会导致未定义的行为。所以这就是行为分歧的地方。

纯粹从性能角度来看这一点,并忽略函数中的语义差异,主要区别在于使用 case 的版本对输入值进行了测试和分支,而输入值中不存在数组版本。此外,使用 case 的版本具有较大的代码,因此可能不太适合缓存。因此,通过对代码的分析,我们可能期望数组版本更快。它要做的事情更少,没有分支,代码更小。

如果性能对您来说确实很重要,那么您需要在运行此代码的实际设置中执行一些实际的计时。我无法执行这些计时,因为它们是人为的。任何时候仅在代码上下文中才具有真正意义。确实,在您的程序设置中,您将无法测量两个版本之间的差异,这确实是非常合理的。在这种情况下,上述分析就没有意义了。

关于arrays - 当查找映射到小整数的常量时,使用 case 语句还是常量数组更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17322338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com