Perl中的哈希只有字符串作为键。因此,无论如何,
我写了这个示例代码来检查整数索引还是字符串索引在perl哈希中更好。
use Time::Local;
use Time::HiRes qw/gettimeofday/;
my %string_hash;
my %int_hash;
$i_count = 100;
$j_count = 100;
$k_count = 1000;
foreach $i (0..$i_count)
{
foreach $i (0..$j_count)
{
foreach $k (0..$k_count)
{
$i += 0;$j += 0;$k += 0;
$int_hash{$i}->{$j}->{$k} = 1;
$string_hash{"$i"}->{"$j"}->{"$k"} = 1;
}
}
}
my $profile = gettimeofday();
print "String hash start:$profilen";
foreach $i (keys %string_hash)
{
foreach $j(keys %{ $string_hash{$i} })
{
foreach $k(keys %{ $string_hash{$i}{$j} })
{
$i += 0;$j += 0;$k += 0;
$val = $string_hash{$i}->{$j}->{$k};
}
}
}
printf("String hash took:%d millisecn", (gettimeofday()-$profile)*1000);
$profile = gettimeofday();
print "Int hash start:$profilen";
foreach $i (keys %int_hash)
{
foreach $j(keys %{ $int_hash{$i} })
{
foreach $k(keys %{ $int_hash{$i}{$j} })
{
$i += 0;$j += 0;$k += 0;
$val = $int_hash{$i}->{$j}->{$k};
}
}
}
printf("Int hash took:%d millisecn", (gettimeofday()-$profile)*1000);
我得到了这个输出
$perl hashs.pl字符串哈希起始:1308199085.84375字符串哈希耗时:500毫秒Int哈希起始:1308199086.34379Int哈希占用:428毫秒
我正在Cygwin(Windows)中尝试此操作,Perl版本为5.10.1
我有几个问题1) 当我们在Hash中存储一个整数时,是为此计算哈希键,还是Perl直接在bucket中使用vale?2) 如果我把字符串转换成整数,我是否会得到任何性能改进?3) 如果我需要在multihash中保留一个64位值作为密钥,这将提供更好的性能bigint或将64位值保留为字符串
$int_hash
的键都被强制转换为字符串,因此两个版本之间运行时间的任何差异都应该可以忽略不计。