是多哈希中的整数索引比字符串索引更好



我写了这个示例代码来检查整数索引还是字符串索引在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位值保留为字符串

Perl中的哈希只有字符串作为键。因此,无论如何,$int_hash的键都被强制转换为字符串,因此两个版本之间运行时间的任何差异都应该可以忽略不计。

最新更新