See the diagrams for HVs at the bottom of PerlGuts Illustrated.
I think that the differences in moritz' benchmark come about because die is an uncommonly slow opcode--essentially a long jump--which completely swamps the conditional test and so skews the timing beyond recognition.
[0] Perl> for(2..6){ %a =(); %b = 1.."1e$_"; cmpthese -1, { A=>q[ for(1 .. 10000){ if( %a ){ 1; } } ], B=>q[ for(1 .. 10000){ unless( %b ){ 1; } } ] } };; Rate B A B 72.0/s -- -90% A 726/s 908% -- Rate B A B 72.6/s -- -90% A 736/s 914% -- Rate B A B 70.5/s -- -91% A 751/s 965% -- Rate B A B 69.5/s -- -91% A 759/s 992% -- Rate B A B 71.5/s -- -90% A 715/s 900% -- [0] Perl> for(2..6){ %a =(); %b = 1.."1e$_"; cmpthese -1, { A=>q[ for(1 .. 10000){ unless( %a ){ 1; } } ], B=>q[ for(1 .. 10000){ if( %b ){ 1; } } ] } };; Rate B A B 75.9/s -- -89% A 709/s 834% -- Rate B A B 73.7/s -- -90% A 730/s 890% -- Rate B A B 72.7/s -- -90% A 747/s 928% -- Rate B A B 71.5/s -- -90% A 725/s 914% -- Rate B A B 70.6/s -- -90% A 708/s 903% --
The difference between empty and full hashes is remarkably consistant--if surprisingly high--regardless of the magnitude of the hash.
In reply to Re^7: What is the most efficient way to see if a hash is empty?
by BrowserUk
in thread What is the most efficient way to see if a hash is empty?
by ELISHEVA
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |