x演算子のメモリの使い方。
10MBのダミーデータをメモリ上に確保しようと思ったらよくわからないことが。
[hideden@hideden-x61]$ perl -e '$a = "." x (10*1024*1024); sleep 60;' & [1] 7433 [hideden@hideden-x61]$ perl -e '$a = "."; $a x= 10*1024*1024; sleep 60;' & [2] 7434 [hideden@hideden-x61]$ ps auxww | grep \[p\]erl [~] 18:36 hideden 7433 0.3 1.0 26680 21760 pts/9 SN 18:36 0:00 perl -e $a = "." x (10*1024*1024); sleep 60; hideden 7434 0.2 0.5 16436 11520 pts/9 SN 18:36 0:00 perl -e $a = "."; $a x= 10*1024*1024; sleep 60;
$aの中身はどっちも同じになる。Devel::Sizeのsizeとかを使って調べると値は同じ。でもプロセスのメモリ使用量は約2倍。
GCまわりとかだろうかなと予想してみる。違うのかな。うーん。Perlって難しいね。
この謎の10MBは、x演算子が一時的に使ったものなんだろうか。スコープ抜けたら消えるのかなとか思って色々やってみたけど開放されず。でかいスクリプトとかだとどっかのタイミングで開放されるのかな・・・?
うーん。謎だ。らくだ本とかに載ってるのかな。帰ったら読んでみよう。
一応perl -V
[hideden@hideden-x61]$ perl -V [~] 18:37
Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=linux, osvers=2.6.22-gentoo-r8, archname=i686-linux
uname='linux hideden-x61 2.6.22-gentoo-r8 #2 smp fri oct 5 12:40:55 jst 2007 i686 intel(r) core(tm)2 duo cpu t7300 @ 2.00ghz genuineintel gnulinux '
config_args='-des -Darchname=i686-linux -Dcccdlflags=-fPIC -Dccdlflags=-rdynamic -Dcc=i686-pc-linux-gnu-gcc -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr -Dlocincpth= -Doptimize=-O3 -march=prescott -mfpmath=sse -msse -msse2 -msse3 -pipe -fomit-frame-pointer -Duselargefiles -Dd_semctl_semun -Dscriptdir=/usr/bin -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dinstallman1dir=/usr/share/man/man1 -Dinstallman3dir=/usr/share/man/man3 -Dman1ext=1 -Dman3ext=3pm -Dinc_version_list=5.8.0 5.8.0/i686-linux 5.8.2 5.8.2/i686-linux 5.8.4 5.8.4/i686-linux 5.8.5 5.8.5/i686-linux 5.8.6 5.8.6/i686-linux 5.8.7 5.8.7/i686-linux -Dcf_by=Gentoo -Ud_csh -Dusenm -Di_ndbm -Di_gdbm -Di_db'
hint=recommended, useposix=true, d_sigaction=define
usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='i686-pc-linux-gnu-gcc', ccflags ='-fno-strict-aliasing -pipe -Wdeclaration-after-statement -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
optimize='-O3 -march=prescott -mfpmath=sse -msse -msse2 -msse3 -pipe -fomit-frame-pointer',
cppflags='-fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/include/gdbm'
ccversion='', gccversion='4.2.2 (Gentoo 4.2.2 p1.0)', gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='i686-pc-linux-gnu-gcc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc
perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
libc=/lib/libc-2.6.1.so, so=so, useshrplib=false, libperl=libperl.a
gnulibc_version='2.6.1'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'
Characteristics of this binary (from libperl):
Compile-time options: PERL_MALLOC_WRAP USE_LARGE_FILES USE_PERLIO
Built under linux
Compiled at Jan 6 2008 23:25:55
@INC:
/etc/perl
/usr/lib/perl5/vendor_perl/5.8.8/i686-linux
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib/perl5/site_perl/5.8.8/i686-linux
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib/perl5/5.8.8/i686-linux
/usr/lib/perl5/5.8.8
/usr/local/lib/site_perl
.