----- Original Message ----- From: "JupiterHost.Net" <[EMAIL PROTECTED]> Date: Tuesday, January 25, 2005 11:01 am Subject: Re: hash slice/exists vs. grep benchmark weirdness...
> > You have to stop spending so much time playing with all this bogus > > benchmarking :) > > It not bogus :) Its an example to find the best method for a project. > > If you prefer I'll ask the question I was trying to answer with > the > benchmark: > > Assuming you have an array of 0-15 elements is it quicker/more > efficient to: > > 1) create a hash slice and use exists when checking for specific > onesor > 2) grep a regex out of the array when checking for specific ones > > >>slice: > >>use strict; > >>use warnings; > >>my @k=qw(1 2 3 4 5 6); > >>my %n;@[EMAIL PROTECTED] = @k; > >>print "hi" if exists $n{1}; > >>print "hi" if exists $n{3}; > >>print "hi" if exists $n{5}; > >>print "hi" if exists $n{7}; > >>print "hi" if exists $n{9}; > >>print "hi" if exists $n{11}; > >> > >>grep: > >>use strict; > >>use warnings; > >>my @k=qw(1 2 3 4 5 6); > >>print "hi" if grep /^1$/, @k; > >>print "hi" if grep /^3$/, @k; > >>print "hi" if grep /^5$/, @k; > >>print "hi" if grep /^7$/, @k; > >>print "hi" if grep /^9$/, @k; > >>print "hi" if grep /^11$/, @k; > >> > >>Benchmark: timing 5000000 iterations of grep, slice... > >> grep: 3.65945 wallclock secs ( 2.33 usr + 0.04 sys = > 2.37 CPU) > >>@ 2109704.64/s (n=5000000) > >> slice: 2.37966 wallclock secs ( 2.52 usr + -0.01 sys = > 2.51 CPU) > >>@ 1992031.87/s (n=5000000) > >> Rate slice grep > >>slice 1992032/s -- -6% > >>grep 2109705/s 6% -- > >> > >>I would've thought the "slice and then use exists" would have > been > >>faster then "greping the entire array each time and using > regexes" when > >>you check it. but its consistently faster by an average 6-10% > >> > >>Any ideas why that might be? > > > > Well, first -- you're creating the hash inside the benchmark loop, > > which is not particularly light-weight. > > Good point, > although in the real world app I'll have an array already so I > want to > see if its quicker to: > - make the hash via a slice and use exists > or > - just grep the whole array each time with a regex > If I use > my %hash = qw(1..20000); > and exists > vs. > my @array = qw(1..10000); > IE - no slice > > then exists is a bit faster 2% or so, the problem is I start with > an > array I have no control over. > > So, I'd have to do a slice to get the hash (or loop through it or > otherwise do something to get the hash) > > > Second: You're using pathologically small lists. Try running > it with > > 10,000 elements instead of ten. > > that makes them about even, with slice being 1% faster at times, > however > the size of the array in the real world app are similar to the > original > benchmark > > > Third: Premature optimization is a terrible thing. > > Premature? Could you elaborate? Just as an FYI, you don't need "exists" in your code at all. It is just a waste of time in your example. Should be beter writen as: print "hi" if $n{11}; > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > <http://learn.perl.org/> <http://learn.perl.org/first-response> > > > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>