根据this question和this answer,列表被实现为数组:
因此,您可以期望通过数字偏移量访问元素将同样快,因为它们是实现中的数组,提供了非常快的恒定时间索引。但是,作者在Learning Perl的脚注中说
当列表实际上是一个底层数组时,如何做到这一点呢?我知道尝试将Perl的速度与C进行比较完全是无知的,但是按偏移量索引列表的速度不会像pop或push一样快吗?这些似乎相互矛盾。
最佳答案
这与将Perl实现为一系列操作码有关。 push,pop,shift和unshift本身都是操作码,因此它们可以索引到要从C中进行操作的数组中,在C中访问速度非常快。如果从Perl使用索引执行此操作,则将使Perl执行额外的操作码以从标量获取索引,从数组获取插槽,然后在其中添加内容。
您可以通过使用-MO = Terse开关来查看Perl的实际含义(在某种意义上):
$foo[$i] = 1
BINOP (0x18beae0) sassign
SVOP (0x18bd850) const IV (0x18b60b0) 1
BINOP (0x18beb60) aelem
UNOP (0x18bedb0) rv2av
SVOP (0x18bef30) gv GV (0x18b60c8) *foo
UNOP (0x18beba0) null [15]
SVOP (0x18bec70) gvsv GV (0x18b60f8) *i
push @foo, 1
LISTOP (0x18bd7b0) push [2]
OP (0x18aff70) pushmark
UNOP (0x18beb20) rv2av [1]
SVOP (0x18bd8f0) gv GV (0x18b60c8) *foo
SVOP (0x18bed10) const IV (0x18b61b8) 1
您会看到Perl必须执行更少的步骤,因此可以预期它会更快。
任何解释语言的窍门是让它完成所有工作。