So I got NYTProf going. A little search gave me the knowledge that calling a page at
http://example.com/myprog.cgi?foo=bar is the same as calling it with perl myprog.cgi 'foo=bar', which is so good to know, especially since the addition of the NYTProf step is perl -d:NYTProf myprog.cgi 'foo=bar' .
So, I was able to shave off a second by caching. I could have HOP'd it and just used Memoize, but I like having all the details of a program visible so I don't get bit by something I can't see.
{
# all lines of code with %url_cache are new
# URLs have been changed to protect the innocent.
my %url_cache ;
sub get_service_page {
my ( $pi ) = @_ ;
if ( $url_cache{ $pi } ) {
return $url_cache{ $pi } ;
}
my $readfile = pi_Readfile() ;
my $url = 'http://www.example.edu/~user/projects/XXXXX/' ;
my $alt =
'http://www.example.edu/~user/something_else.cgi'
;
my $attr = 'SGNAME_PUTATIVE' ;
my $sgname = $readfile->{ $pi }->{ $attr } ;
if ( ! defined $sgname || '' eq $sgname ) {
$url_cache{ $pi } = $alt ;
return $alt ;
}
$url =~ s/XXXXX/$sgname/ ;
$url_cache{ $pi } = $url ;
return $url ;
}
}
So, simply by holding onto that little piece of information instead of checking against the same
I don't know why it didn't occur to me to do that in the first place....
pi_Readfile() each time, I was able to go from 2-3 seconds to 1.2 seconds. And, now that I'm seeing it, I could hold onto the data structure I get from pi_Readfile() the same way I hold onto the cache, and could probably tighten up even more.I don't know why it didn't occur to me to do that in the first place....
No comments:
Post a Comment