gpt4 book ai didi

perl - 为什么符号的封装限定会导致使用更少的内存,即使符号是本地导入的?

转载 作者:行者123 更新时间:2023-12-03 14:31:15 27 4
gpt4 key购买 nike

注意,我试过 testing this before in this question which may look similar ,但是这些结果是有缺陷的,并且 result of constant folding, which I subsequently disabled.并在此问题中重新发布。

鉴于这两个评估(对执行的评论),它们只会改变 &Module::FOO()&FOO() .

# Symbols imported, and used locally.
eval qq[
package Foo$num;
Module->import();
my \$result = &Module::FOO() * &Module::FOO();
] or die $@;

# Symbols imported, not used locally referencing parent symbol.
eval qq[
package Foo$num;
Module->import();
my \$result = &FOO() * &FOO();
] or die $@;
为什么顶部块会占用 大幅更小的空间?脚本和输出复制如下,
脚本
package Module {
use v5.30;
use warnings;
use constant FOO => 42;
use Exporter 'import';
our @EXPORT = ('FOO');
}


package main {
use v5.30;
use autodie;
use warnings;

$|=1;
say "Our PID is $$";

for my $num ( 0..1e5 ) {
eval qq[
package Foo$num;
Module->import();
my \$result = &Module::FOO() * &Module::FOO();
] or die $@;
eval qq[
package Foo$num;
Module->import();
my \$result = &FOO() * &FOO();
] or die $@;
}

say "DONE";

_debug();

}

sub _debug {
open my $fh, "<", "/proc/$$/status";
while ( <$fh> ) {
next unless /Rss/;
print;
}
}
结果
包(命名空间)限定
RssAnon:     101856 kB
RssFile: 5228 kB
RssShmem: 0 kB
本地进口
RssAnon:     151528 kB
RssFile: 5224 kB
RssShmem: 0 kB
更新
aquanight 请求在 irc.freenode.net/#perlconstant 试试这个实验直接,这是我使用的代码,
eval qq[ 
package Foo$num;
use constant FOO => 42;
my \$result = &FOO() * &FOO();
] or die $@;
eval qq[
package Foo$num;
use constant FOO => 42;
my \$result = &Foo${num}::FOO() * &Foo${num}::FOO();
] or die $@;
有了这个 两者 像这样执行的示例,要清楚的是,直接使用带有常量的变体并通过包限定访问常量实际上更糟糕,然后创建另一个包,该包具有该包的常量和包限定。
Our PID is 204846
RssAnon: 143560 kB
RssFile: 5196 kB
RssShmem: 0 kB

最佳答案

导出整个符号
如果导出 似乎可以非常接近整个符号而不是全局中的一个插槽,

our @EXPORT = ('*FOO');
重新运行相同的测试,你会发现两者非常相似
RssAnon:      93900 kB
RssFile: 5228 kB
RssShmem: 0 kB
事实上,这更接近于理论最大值,从而减少了对 import 的调用。完全,
eval qq[
package Foo$num;
my \$result = &Module::FOO() * &Module::FOO();
] or die $@;
其中产生,
RssAnon:      74528 kB
RssFile: 5160 kB
RssShmem: 0 kB
也许,最大的黑魔法喜悦。
然而,如果我们像 aquanight 所建议的那样检查这个荣耀的金块,
our sub FOO;      # top of file
Module->import();

package Bar;
print FOO(); # works
print Bar::FOO(); # does not work
符号 FOO可用于包装 Bar没有腹胀 Bar包裹。当将此方法应用于上述基准测试时,它看起来像,
eval qq[
our sub FOO ();
Module->import();
package Foo$num;
my \$result = FOO() * FOO();
] or die $@;
并产生这些结果,
RssAnon:      75112 kB
RssFile: 5284 kB
RssShmem: 0 kB
constant.pm ,
这可以进一步实现为,
eval qq[
our sub FOO ();
use constant FOO => 42;
package Foo$num;
my \$result = FOO() * FOO();
];
这将产生这些结果,
RssAnon:      75076 kB
RssFile: 5180 kB
RssShmem: 0 kB

关于perl - 为什么符号的封装限定会导致使用更少的内存,即使符号是本地导入的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66038573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com