Rakudo/MoarVM动态作用域变量实现及性能影响问询
Raku动态作用域变量的性能与行为细节
我想了解Raku中$*scalar、@*array、%*hash这类动态作用域变量,对语法/正则引擎整体性能的影响程度。具体想搞清楚以下操作的内部过程,以及它们和符号表、调用栈或动态作用域相关数据结构(比如专用栈、哈希表栈)的关联:
查找操作
my $var-1 = $*scalar my $var-2 = @*array[3] my $var-3 = %*hash<key>
插入与修改操作
$*scalar = "new value 1" @*array[3] = "new value 2" %*hash{"existing key"} = "new value 3" %*hash{"new key"} = "new value 3"
我重点关注数组和哈希:每次对数组元素进行压入/弹出/修改/插入,或对哈希进行键值对插入/修改/删除时,这些数据结构是否会被完全复制?
补充澄清:对动态作用域的误解
我之前错误地认为,修改Raku的动态作用域哈希时,变更会在当前词法作用域结束后自动撤销,类似Perl中local关键字的“临时栈”行为,因此才提出了数据结构是否复制的问题。但实际并非如此,以下通过代码对比说明:
Raku 1:直接修改动态哈希(无自动撤销)
my %*hash = (key => "value"); sub test() { say "test() start"; say "\t", %*hash; %*hash<key>="new value"; say "\t", %*hash; say "test() end"; } say %*hash; test(); say %*hash;
输出:
{key => value} test() start {key => value} {key => new value} test() end {key => new value}
Perl:使用local实现临时修改
our %hash=(key => "value"); sub test { local %hash=%hash; say "test() start"; say "\t", %hash; $hash{key}="new value"; say "\t", %hash; say "test() end" } say %hash; test(); say %hash;
输出:
keyvalue test() start keyvalue keynew value test() end keyvalue
Raku 2:手动复刻Perl local的行为
my %*hash = (key => "value"); sub test() { my %*hash=CALLERS::<%*hash>; say "test() start"; say "\t", %*hash; %*hash<key>="new value"; say "\t", %*hash; say "test() end"; } say %*hash; test(); say %*hash;
输出:
{key => value} test() start {key => value} {key => new value} test() end {key => value}
内容的提问来源于stack exchange,提问作者WhiteMist
相关产品推荐
相关产品推荐

