lis*_*tor 4 comparison type-conversion raku
我经常需要将数据从一种类型转换为另一种类型,然后进行比较。一些运算符会先转换为特定类型,这种转换可能会导致效率损失。例如,我可能有
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: );
Run Code Online (Sandbox Code Playgroud)
运算符“eq”和“==”将首先将数据转换为可消化的类型,这可能会减慢速度。如果无法提前知道要比较的数据,运算符“eqv”和“===”是否会跳过转换数据类型并提高效率(即,您完全不知道将要获得什么)?
从这个问题中我不太清楚您是否真的希望转换发生。
操作符 like==和eqare 实际上是对multi subs 的调用,其名称类似于infix:<==>,并且有很多候选者。例如,有一个 for (Int, Int),如果我们比较两个Ints ,就会选择它。在这种情况下,它知道它不需要强制,而只会进行整数比较。
在eqv与===运营商将不会把; 他们做的第一件事是检查值是否具有相同的类型,如果不是,他们就不会再进一步。根据您想要快照语义 ( eqv) 还是引用语义 ( ===),确保使用正确的一种。请注意,类型确实必须完全相同,因此1e0 === 1不会出现,因为一个值是 aNum而另一个是 an Int。
运算符 like==和的自动强制行为eq真的很方便,但从性能角度来看,它也可能是一个陷阱。他们强制,将强制的结果用于比较,然后将其丢弃。因此,反复进行比较会反复触发强制转换。如果遇到这种情况,将工作分为两个阶段是有意义的:首先将传入的数据“解析”为适当的数据类型,然后继续进行比较。
最后,在任何关于效率的讨论中,值得注意的是运行时优化器擅长消除重复类型检查。因此,虽然原则上,如果您阅读内置源代码,==在它获得两个具有相同类型的东西的情况下可能看起来更便宜,因为它没有强制执行它们是完全相同的类型,实际上额外的检查将得到优化对于===反正。
双方===并eqv首先检查操作数是否相同类型的,并且将返回False,如果他们不。所以在那个阶段,他们之间没有真正的区别。
该a === b运营商是非常短的对a.WHICH eq b.WHICH。所以它会调用.WHICH操作数上的方法,如果操作数是一个非常大的Buf.
该a eqv b操作是比较复杂的,因为它有特殊的套管许多的对象比较,所以一般你不能说太多关于它。
换句话说:YMMV。如果你真的对性能感兴趣,基准测试!如果另一种解决问题的方法证明性能更好,请准备好调整您的代码。
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |