在Perl中取消引用数组引用有多贵?
我很好奇Perl internals是否创建了ref值的副本来创建数组?例如,以下输出分隔字符串的最后一个和第一个值:
say @{[ split( q{|},q{bar|is|foo} ) ]}[-1,0]; # STDOUT: foobarn >操作是否首先通过拆分生成列表并创建数组引用,然后在解除引用时将数组ref的值复制到新数组中? 因为解除引用是如此常见,我确信它已经过优化,我只是好奇它与最初从列表中创建数组相比有多昂贵,例如: my @parts = split q{|},q{bar|is|foo}; say @parts[-1,0]; 目的:了解底层操作,而无需深入了解代码 解决方法
同样,这是一个无用的问题.替代方案永远不会简单地取消引用数组和其他东西. 但是既然你坚持认为,对我来说这是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%!
>是,split返回一个列表.标量上下文除外.
如果引用变成其他东西,那将是非常糟糕的.你究竟是什么意思? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |