#!/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]); exit; #### perl tmp.pl keys 10000 > log perl tmp.pl each 10000 >> log perl tmp.pl keys 100000 >> log perl tmp.pl each 100000 >> log perl tmp.pl keys 1000000 >> log perl tmp.pl each 1000000 >> log perl tmp.pl keys 2000000 >> log perl tmp.pl each 2000000 >> log #### ###count=10000,keys### before: size=10035200,vsize=10035200,resident=5500928,share=5143114,rss=5500928 after hash: size=13180928,vsize=13180928,resident=8306688,share=5143114,rss=8306688 after loop: size=13180928,vsize=13180928,resident=8376320,share=5143114,rss=8376320 time=0.043 ###count=10000,each### before: size=10035200,vsize=10035200,resident=5541888,share=5143114,rss=5541888 after hash: size=13180928,vsize=13180928,resident=8347648,share=5143114,rss=8347648 after loop: size=13180928,vsize=13180928,resident=8417280,share=5143114,rss=8417280 time=0.050 ###count=100000,keys### before: size=10035200,vsize=10035200,resident=5541888,share=5143114,rss=5541888 after hash: size=43589632,vsize=43589632,resident=39514112,share=5143114,rss=39514112 after loop: size=43589632,vsize=43589632,resident=39514112,share=5143114,rss=39514112 time=0.689 ###count=100000,each### before: size=10035200,vsize=10035200,resident=5541888,share=5143114,rss=5541888 after hash: size=43589632,vsize=43589632,resident=39514112,share=5143114,rss=39514112 after loop: size=43589632,vsize=43589632,resident=39514112,share=5143114,rss=39514112 time=0.799 ###count=1000000,keys### before: size=10035200,vsize=10035200,resident=5545984,share=5143114,rss=5545984 after hash: size=296296448,vsize=296296448,resident=282710016,share=5143114,rss=282710016 after loop: size=297345024,vsize=297345024,resident=282718208,share=5143114,rss=282718208 time=7.389 ###count=1000000,each### before: size=10035200,vsize=10035200,resident=5545984,share=5143114,rss=5545984 after hash: size=296296448,vsize=296296448,resident=282710016,share=5143114,rss=282710016 after loop: size=297345024,vsize=297345024,resident=282718208,share=5143114,rss=282718208 time=8.522 ###count=2000000,keys### before: size=10035200,vsize=10035200,resident=5545984,share=5143114,rss=5545984 after hash: size=582557696,vsize=582557696,resident=354185216,share=5143114,rss=354185216 after loop: size=583606272,vsize=583606272,resident=360177664,share=5143114,rss=360177664 time=103.454 ###count=2000000,each### before: size=10035200,vsize=10035200,resident=5484544,share=5143114,rss=5484544 after hash: size=582557696,vsize=582557696,resident=359972864,share=5143114,rss=359972864 after loop: size=583606272,vsize=583606272,resident=352419840,share=5143114,rss=352419840 time=268.264 #### #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Benchmark qw/cmpthese timethese/; my($max,%h); $max=1000000; %h=map { $_ => "test" } (1 .. $max); sub with_keys{ foreach my $k (keys %h){ #no proc } } sub with_each{ while( my($k,$v)=each %h){ #no proc } } cmpthese( timethese( 100, { 'with keys'=> &with_keys, 'with each'=> &with_each, } ) ); #### Benchmark: timing 100 iterations of with each, with keys... with each: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count) with keys: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count) Rate with each with keys with each 100000000000000000/s -- 0% with keys 100000000000000000/s 0% --