How I made my core testsuite 2x faster
There is more than one way to make perl5 twice as fast, but this is what I did today. I fixed it on one machine.
My Macbook Air gives constantly better results in my hash function benchmarks than my big Linux Desktop PC, because it has a newer i7 Haswell, and the linux has only an older i5 CPU. Both have fast SSD's and enough RAM.
But when I run the perl5 testsuite the linux machine is twice as fast. Typically 530s vs 1200s. Which is odd and very annoying.
And then I fixed it with one little change.
$ time ./perl -Ilib -MNet::Domain -e'print Net::Domain::hostname()'
real 1m0.151s
user 0m0.028s
sys 0m0.011s
$ hostname
airc
$ sudo hostname airc.local
airc.local
$ time ./perl -Ilib -MNet::Domain -e'print Net::Domain::hostname()'
airc.local
real 0m0.039s
user 0m0.027s
sys 0m0.008s
You see that Net::Domain::hostname didn't return a value. It timed out. Great for testsuites and benchmarks.
The code in Net::Domain calls for MacOS just hostname
, which is fast, but for darwin it calls sys_hostname
. But this is fast also. So what else is going on?
sub domainname {
return $fqdn
if (defined $fqdn);
_hostname();
# *.local names are special on darwin. If we call gethostbyname below, it
# may hang while waiting for another, non-existent computer to respond.
if($^O eq 'darwin' && $host =~ /\.local$/) {
return $host;
}
I cannot beat this magic, so I changed my hostname on my laptop. Problem solved. Aargh
Elapsed: 637 sec
It might be of interest to check out Wikipedia: .local.
I wonder if Net::Domain should remove the OS check as .local has been reserved for Multicast DNS resolution since Feb 2013.
Thanks for sharing this tip! I found it on Perl Weekly.