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