加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中取消引用数组引用有多贵?

发布时间:2020-12-15 23:36:53 所属栏目:大数据 来源:网络整理
导读:我很好奇Perl internals是否创建了ref值的副本来创建数组?例如,以下输出分隔字符串的最后一个和第一个值: say @{[ split( q{|},q{bar|is|foo} ) ]}[-1,0]; # STDOUT: foobarn 操作是否首先通过拆分生成列表并创建数组引用,然后在解除引用时将数组ref的值
我很好奇Perl internals是否创建了ref值的副本来创建数组?例如,以下输出分隔字符串的最后一个和第一个值:

say @{[ split( q{|},q{bar|is|foo} ) ]}[-1,0];     # STDOUT: foobarn

>操作是否首先通过拆分生成列表并创建数组引用,然后在解除引用时将数组ref的值复制到新数组中?
>它是否将当前的arrayref变形?

因为解除引用是如此常见,我确信它已经过优化,我只是好奇它与最初从列表中创建数组相比有多昂贵,例如:

my @parts = split q{|},q{bar|is|foo};
say @parts[-1,0];

目的:了解底层操作,而无需深入了解代码

解决方法

vol7ron> How expensive is it to dereference an array ref in Perl?

ikegami> You’re doing more than just dereferencing an array.

vol7ron> But the question still stands

同样,这是一个无用的问题.替代方案永远不会简单地取消引用数组和其他东西.

但是既然你坚持认为,对我来说这是37毫秒(370亿分之一秒).

use Benchmark qw( cmpthese );

my %tests = (
   deref => 'my @y = @$x;',none  => 'my @y = @x;',);

$_ = 'use strict; use warnings; our $x; our @x; ' . $_
   for values %tests;

{
   local our @x = ();
   local our $x = @x;
   cmpthese(-3,%tests);
}

结果:

Rate deref  none
deref 3187659/s    --  -12%
none  3616848/s   13%    --

每个deref所需的时间= 1/3187659 s – 1/3616848 s = 37 ns

它很小!取消引用该数组只占取消引用空数组并将其复制到另一个数组所用时间的12%!

Does the operation first generate a list via split (1) and create an array ref (2),then copy the values of the array ref into a new array when dereferencing (3)?

>是,split返回一个列表.标量上下文除外.
> […]不只是创建一个引用,它还创建一个数组并将值复制到其中.
>不,取消引用不会复制值.

Does it morph the current arrayref in place?

如果引用变成其他东西,那将是非常糟糕的.你究竟是什么意思?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读