gpt4 book ai didi

type-conversion - 比较任意两项的最有效运算符是什么?

转载 作者:行者123 更新时间:2023-12-03 18:30:34 26 4
gpt4 key购买 nike

我经常需要将数据从一种类型转换为另一种类型,然后进行比较。一些运算符会先转换为特定类型,这种转换可能会导致效率损失。例如,我可能有

my $a, $b = 0, "foo"; # initial value
$a = (3,4,5).Set; # re-assign value
$b = open "dataFile"; # re-assign value

if $a eq $b { say "okay"; } # convert to string
if $a == 5 { say "yes"; } # convert to number
if $a == $b {} # error, Cannot resolve caller Numeric(IO::Handle:D: );

运算符“eq”和“==”将首先将数据转换为可消化的类型,这可能会减慢速度。如果无法提前知道要比较的数据,运算符“eqv”和“===”是否会跳过转换数据类型并提高效率(即,您完全不知道您将提前获得什么)?

最佳答案

从这个问题中我不太清楚您是否真的希望转换发生。

运营商如 ==eq真的是调用 multi sub s 的名称如 infix:<==> ,并且有很多候选人。例如,(Int, Int) 有一个,如果我们比较两个 Int 就会选择它s。在这种情况下,它知道它不需要强制,而只会进行整数比较。
eqv===运算符(operator)不会强制;他们做的第一件事是检查值是否具有相同的类型,如果不是,他们就不会再进一步​​。根据您是想要快照语义( eqv )还是引用语义( === ),确保使用正确的一种。请注意,类型确实必须完全相同,因此 1e0 === 1不会出现,因为一个值是 Num另一个是 Int .

== 这样的操作符的自动强制行为和 eq可能真的很方便,但从性能角度来看,它也可能是一个陷阱。他们强制,将强制的结果用于比较,然后将其丢弃。因此,反复进行比较会反复触发强制转换。如果遇到这种情况,将工作分为两个阶段是有意义的:首先将传入的数据“解析”为适当的数据类型,然后继续进行比较。

最后,在任何关于效率的讨论中,值得注意的是运行时优化器擅长消除重复类型检查。因此,原则上,如果您阅读内置源代码,==如果两个东西具有相同的类型,可能看起来更便宜,因为它没有强制执行它们是完全相同的类型,实际上,额外的检查将针对 === 进行优化。反正。

关于type-conversion - 比较任意两项的最有效运算符是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61023811/

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