根据this questionthis 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必须执行更少的步骤,因此可以预期它会更快。

任何解释语言的窍门是让它完成所有工作。

10-07 19:20
查看更多