2011-06-16 65 views
1

我写了这个示例代码来检查整数或字符串索引在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:$profile\n"; 
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 millisec\n", (gettimeofday()-$profile)*1000); 




$profile = gettimeofday(); 
print "Int hash start:$profile\n"; 
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 millisec\n", (gettimeofday()-$profile)*1000); 

我得到这个输出

$ perl的hashs.pl 字符串散列开始:1308199085.84375 字符串散了:500毫秒 诠释哈希开始:1308199086.34379 诠释哈希了:428毫秒

我试图在Cygwin(Windows)和Perl版本是5.10.1

我有几个问题在这里 1)Whe n我们在Hash中存储一个整数是否为其计算散列键,或者Perl是否直接在存储区中使用该值? 2)而不是存储一个字符串,如果我将其转换为整数,无论​​我会得到任何性能改进? 3)如果我需要保留一个64位的值作为multihash中的键值,这将提供更好的性能bigint或将64bit值保留为一个字符串

+5

使用基准测试模块 – ysth 2011-06-16 04:51:08

+0

如果您使用从0开始的连续整数,则应该使用一个数组,该数组的速度将显着快于散列。 – 2011-06-16 20:48:43

+0

它不顺序并从一个bigint文件中读取数据 – Raghuram 2011-06-17 05:23:54

回答

13

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