I forgot to paste functions! I saw only process's memory size, I cut other outputs of GTop.
#!/usr/bin/perl
use strict;
use warnings;
use GTop();
use Time::HiRes;
my($gtop,$max,%h,@t);
$gtop=new GTop;
$t[0]=Time::HiRes::time();
printf "###count=$ARGV[1],$ARGV[0]###\n";
p("before");
$max=$ARGV[1];
%h=map { $_ => "test" } (1 .. $max);
p("after hash");
if ($ARGV[0] eq "keys"){
&with_keys();
} elsif($ARGV[0] eq "each") {
&with_each();
} else {
print "else\n";
}
p("after loop");
$t[1]=Time::HiRes::time();
printf "time=%.3f\n", ($t[1]-$t[0]);
sub p {
my ($cap)=@_;
my $m=$gtop->proc_mem($$);
#printf "$cap: size=%s,vsize=%s,resident=%s,share=%s,rss=%s\n"
# ,$m->size,$m->vsize,$m->resident,$m->share,$m->rss;
printf "%-10s: size=%s\n",$cap,$m->size;
}
sub with_keys{
foreach my $k (keys %h){
#no proc
}
}
sub with_each{
while( my($k,$v)=each %h){
#no proc
}
}
Output comes like this.
###count=10000,keys###
before : size=8708096
after hash: size=11853824
after loop: size=11853824
time=0.044
###count=10000,each###
before : size=8708096
after hash: size=11853824
after loop: size=11853824
time=0.050
###count=100000,keys###
before : size=8708096
after hash: size=41213952
after loop: size=41213952
time=0.682
###count=100000,each###
before : size=8708096
after hash: size=41213952
after loop: size=41213952
time=0.805
###count=1000000,keys###
before : size=8708096
after hash: size=294969344
after loop: size=296017920
time=7.568
###count=1000000,each###
before : size=8708096
after hash: size=294969344
after loop: size=296017920
time=8.563
###count=2000000,keys###
before : size=8708096
after hash: size=581230592
after loop: size=582279168
time=104.976
###count=2000000,each###
before : size=8708096
after hash: size=581230592
after loop: size=582279168
time=225.191
perl -E"my %h = 1..100; for my $k(keys %h){ undef %h; say scalar %h; s
+ay $k }"
I understood what this means. Count shows 0 but keys exists. It means there is separate list. I wonder why GTop's memory shows exactly same size between foreach and while? I mean "after loop: size" value in my output.
As for second shell script, I will change it to first "each" and next "keys" test. And I'll add some sleep statment for swap problem. It takes some time, so I'll report it later. Thanks a lot for reply.
|