【发布时间】:2010-06-04 15:07:35
【问题描述】:
Linux 使用COW 在fork 后保持低内存使用率,但Perl 5 变量在perl 中的工作方式似乎破坏了这种优化。例如,对于变量:
my $s = "1";
perl 真的在存储:
SV = PV(0x100801068) at 0x1008272e8
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x100201d50 "1"\0
CUR = 1
LEN = 16
当您在数字上下文中使用该字符串时,它会修改表示数据的 C struct:
SV = PVIV(0x100821610) at 0x1008272e8
REFCNT = 1
FLAGS = (IOK,POK,pIOK,pPOK)
IV = 1
PV = 0x100201d50 "1"\0
CUR = 1
LEN = 16
字符串指针本身并没有改变(它仍然是0x100201d50),但现在它位于不同的C 中struct(PVIV 而不是PV)。我根本没有修改值,但突然间我付出了 COW 成本。有什么方法可以锁定 Perl 5 变量的 perl 表示,以便节省时间(perl 不必将 "0" 转换为 0 第二次)hack 不会伤害我的内存使用?
注意,上面的表示是从这段代码生成的:
perl -MDevel::Peek -e '$s = "1"; Dump $s; $s + 0; Dump $s'
【问题讨论】:
标签: linux performance perl memory-management