hideden.hatenablog.com

はてなぶろぐー。URLなげー。

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
    .