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 .